Освободить или установить на ноль сохраненных членов - PullRequest
2 голосов
/ 19 марта 2011

Лучше ли устанавливать мои сохраненные членские переменные на ноль или освобождать их, когда я убираюсь?Установка сохраненной переменной в nil кажется более безопасным способом освободить объект, не рискуя вызвать его дважды.

Обновление: позвольте мне пояснить, что я имею в виду переменные-члены, для которых установлено свойство retain, а именно:

@property (nonatomic, retain) SomeClass* mInstanceVar;

Ответы [ 2 ]

8 голосов
/ 19 марта 2011

Лучше всего сначала освободить переменные вашего экземпляра, а затем установить их в nil в вашем методе -dealloc.Мне лично нравится делать это следующим образом:

[myVar release], myVar = nil;

Если вы устанавливаете переменные вашего экземпляра на nil, вы не освобождаете их и вызываете утечку памяти.Установка их на nil после освобождения гарантирует, что вы не будете вызывать утечки, и если по какой-то причине вы попытаетесь получить доступ к этим переменным экземпляра позже, вы не получите мусорную память.


Если переменная экземпляра настроена так:

@property (retain) NSObject *myVar;

, тогда не рекомендуется вызывать self.myVar = nil; во время освобождения.Если у вас есть объекты, которые зарегистрированы для уведомлений KVO в переменной вашего экземпляра, вызов self.myVar = nil отправит эти уведомления, и другие объекты будут уведомлены, что плохо, поскольку они будут ожидать, что вы все еще находитесь в действительном состоянии - выесли вы находитесь в процессе освобождения.

Даже если они не зарегистрированы для уведомлений KVO, это все равно не очень хорошая идея, потому что вы никогда не должны вызывать методы, которые могут полагаться на состояние вашего объекта.когда его состояние несовместимо (некоторые переменные могут / не будут существовать), и вы должны просто обработать процесс самостоятельно.[myVar release], myVar = nil; будет достаточно.

Если вам нужна дополнительная информация, прочитайте ответ Дейва Делонга на этот вопрос.


Для инициализации также не рекомендуетсявызовите установщики и получатели свойств (по той же причине, что и выше).При вызове -init вы должны установить вышеупомянутую переменную следующим образом:

myVar = nil; // If you want to set it up as nil.
OR
myVar = [[NSObject alloc] init]; // Or set it up as an actual object.

Избегайте self.myVar = nil и self.myVar = [[NSObject alloc] init в тех случаях, когда ваш класс находится в неопределенном состоянии (эти вызовы хороши в-viewDidLoad и -awakeFromNib, тем не менее, потому что к этому моменту ваш класс был полностью инициализирован, и вы можете положиться на переменные экземпляра, чтобы они были в завершенном состоянии).

2 голосов
/ 19 марта 2011

Если вы получаете доступ к значениям только через методы доступа к свойству, просто установите для свойства значение nil, и оно будет освобождено.

Убедитесь, что все ваши свойства установлены на nil во время dealloc.

...