Освобождение неиспользуемых свойств в iOS - PullRequest
2 голосов
/ 29 июля 2011

Я синтезировал и объявил это свойство в своем классе 'ClassA'

@interface ClassA
    @property (nonatomic, retain) NameFieldCell* nameCell;
@end

Я знаю, что правило гласит, что свойство nameCell должно быть освобождено в моем методе dealloc, когда оно объявлено с помощью retain | copy | ...

Однако, ClassA 'создается лениво, и иногда свойство nameCell даже не используется, что означает, что я не использую его метод установки, не обращаюсь к нему и не сохраняю его явно.

Должен ли я по-прежнему вызывать [nameCell release] в моем методе dealloc? Мне трудно понять, что я должен выпускать что-то, что даже не инициализировано. И поскольку он не инициализирован, счетчик ссылок равен 0 и нет смысла его освобождать? Или nameCell каким-то образом сохраняется автоматически при создании экземпляра ClassA, даже если я им не пользуюсь?

Ответы [ 2 ]

3 голосов
/ 29 июля 2011

В Objective-C память, выделенная alloc для класса, инициализируется равным нулю со всеми битами при выделении (а затем устанавливается isa ivar), что приводит к резервному ivar nameCell. устанавливается по умолчанию nil. И поскольку отправка сообщения на nil в Objective-C не является ошибкой (сообщение просто игнорируется), вы можете просто позвонить на [nameCell release], не беспокоясь о том, было ли когда-либо установлено nameCell.

3 голосов
/ 29 июля 2011

Если nameCell равно нулю, то [nameCell release] не имеет никакого эффекта. Это облегчает охват обоих случаев, так что да, вы должны освободить его в методе dealloc.

Это или начните использовать ARC , и вам не придется об этом беспокоиться.

...