правильна ли эта строка кода для управления памятью (повторная копия NSDate)?

#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];
  

Просто дважды проверяю мое понимание того, что:

  1. требуется ‘copy’, поскольку в противном случае она ссылалась бы на тот же объект и
  2. требуется автоматический выпуск, поскольку я сделал копию

Спасибо

Ответ №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.