Лучше всего сначала освободить переменные экземпляра, а затем установить для них nil
в вашем -dealloc
методе. Мне лично нравится это делать вот так:
[myVar release], myVar = nil;
Если вы установите переменные экземпляра на nil
, вы не освободите их и вызовете утечку памяти. Однако установка для них значения nil
после выпуска гарантирует, что вы не вызовете утечек, и если по какой-то причине вы попытаетесь получить доступ к этим переменным экземпляра позже, вы не получите мусорную память.
Если у вас есть переменная экземпляра, настроенная как таковая,
@property (retain) NSObject *myVar;
тогда не рекомендуется вызывать self.myVar = nil;
во время освобождения. Если у вас есть объекты, которые зарегистрированы для уведомлений KVO в вашей переменной экземпляра, вызов self.myVar = nil
отправит эти уведомления, и другие объекты будут уведомлены, что плохо, потому что они будут ожидать, что вы все еще будете в допустимом состоянии - вы не если вы находитесь в процессе освобождения.
Даже если они не зарегистрированы для уведомлений KVO, это все равно не лучшая идея, потому что вы никогда не должны вызывать методы, которые могут полагаться на состояние вашего объекта, когда его состояние несовместимо (некоторые переменные могут / не существовать), и вы просто следует самостоятельно справиться с этим процессом. [myVar release], myVar = nil;
хватит.
Если вам нужна дополнительная информация, прочтите ответ Дэйва Делонга на this вопрос.
Для инициализации также нецелесообразно вызывать методы установки и получения свойств (во многом по той же причине, что и выше). В вызове -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
, потому что к этому моменту ваш класс был полностью инициализирован, и вы можете полагаться на то, что переменные экземпляра находятся в полное состояние).
person
Itai Ferber
schedule
18.03.2011