#iphone #objective-c #ios #memory-management #autorelease
#iPhone #objective-c #iOS #управление памятью #автоматический выпуск
Вопрос:
правильна ли эта строка кода для управления памятью (повторная копия NSDate)?
У меня есть класс со свойствами:
@property (nonatomic, retain) NSDate* start;
@property (nonatomic, retain) NSDate* coreWeStart;
Теперь в методе init, предполагая, что self.start уже установлен, правильно ли повторно устанавливать coreWeStart на ту же дату:
self.coreWeStart= [[self.start copy] autorelease];
Просто дважды проверяю мое понимание того, что:
- требуется ‘copy’, поскольку в противном случае она ссылалась бы на тот же объект и
- требуется автоматический выпуск, поскольку я сделал копию
Спасибо
Ответ №1:
Я бы сказал, отчасти, но это все равно можно было бы сделать лучше. В частности, вы могли бы сделать:
@property (nonatomic, copy) NSDate* coreWeStart;
… и затем:
self.coreWeStart = self.start;
… чтобы получить то же самое с меньшим количеством кода. Также обязательно сделайте self.coreWeStart = nil
в dealloc (и self.start = nil
тоже).
Комментарии:
1. Я думаю, если вы не хотите, чтобы свойство coreWeStart ссылалось на какое-то другое внешнее свойство в какой-то момент в будущем (т. Е. Свойство сохраняется по какой-то другой причине).
2. могу ли я проверить: (a) есть ли какой-либо способ обойти необходимость устанавливать для них значение nil в dealloc? (b) считаете ли вы, что использование copy может привести к путанице позже, если разработчики не будут следить за тем, как было установлено свойство [т. Е. Обычно ли большую часть времени используется «сохранить»]
3. Обычно мне нравится явно освобождать свою память ([начать выпуск]), а не просто устанавливать значение nil. Проблема с этим подходом заключается в том, что если кто-то случайно введет start = nil вместо self.start =nil, произойдет утечка памяти.
4. Для будущих разработчиков обычно не имеет значения, используете ли вы
retain
илиcopy
. ПосколькуNSDate
является неизменяемым, единственное, чтоcopy
будет делать этоretain
в любом случае. И я бы не рассматривал возможность сохраненияnormal
. Обычно я использую copy, за исключением изменяемых классов.5. @Greg — (a) Да, вы можете вызвать
release
их, согласно комментарию RedBlueThing. (b) На самом деле это зависит от разработчика. В общем,copy
используется для свойств, которые могут быть изменены в другом месте кода. Например, если у вас есть свойство типаNSString
, кто-то может передать вамNSMutableString
экземпляр, а затем изменить его значение впоследствии, что может вызвать проблемы, если свойство объявлено какretain
. Объявление этого какcopy
позволяет избежать проблемы. Тем не менее,NSDate
не имеет изменяемого подкласса, поэтому «нормальным» объявлением дляNSDate
свойств являетсяretain
.
Ответ №2:
Да. Вы поняли.
- Copy возвращает новый объект с числом сохранений, равным единице.
- присвоение ее свойству ключевого слова retain увеличит количество сохранений.
- автоматический выпуск уменьшит количество сохранений.
Итак, ваш объект имеет свойство coreWeStart с числом сохранений, равным единице, которое является копией свойства start.