Objective C iPhone, когда устанавливать ссылки на объекты равными нулю

Я уже довольно давно занимаюсь разработкой с использованием Objective C и Cocoa. Однако мне все еще не совсем ясно, когда я должен устанавливать ссылки на объекты равными нулю. Я знаю, что рекомендуется делать это прямо перед выпуском объекта, у которого есть делегат, и вы также должны сделать это в методе viewDidUnload для сохраненных подпредставлений. Но когда именно это нужно сделать и почему? Что именно он делает? Заранее спасибо.

-Оскар


person Oscar Gomez    schedule 03.11.2009    source источник


Ответы (1)


Скажем, у вас есть указатель myView, определенный в интерфейсе вашего класса:

@interface MyClass {
   UIView *myView;
}

@end

Затем в вашем коде в какой-то момент вы можете освободить эту переменную:

[myView release];

После того, как вы это сделаете, указатель myView не будет указывать на nil, а будет указывать на адрес памяти объекта, который может больше не существовать (поскольку вы только что освободили его). Итак, если вам случится сделать что-то после этого, например:

[myView addSubview:otherView];

вы получите ошибку.

Если, с другой стороны, вы делаете это:

[myView release];
myView = nil;
...
[myView addSubview:otherView];

вызов addSubview не окажет негативного влияния, поскольку сообщения на nil игнорируются.

Как следствие, вы можете увидеть предложения по использованию свойств retain, например:

@property(retain) UIView *myView;

а затем в коде просто выполните:

self.myView = nil;

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

Одна вещь, которую вы никогда не должны забывать, это то, что управление памятью осуществляется с помощью retain release вызовов, а не посредством присваивания nil. Если у вас есть объект со счетчиком сохранения, равным 1, и присвойте его единственной переменной nil, у вас будет утечка памяти:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)];
view = nil;
// You just leaked a UIView instance!!!
person pgb    schedule 03.11.2009
comment
Каждый начинающий программист Cocoa должен прочитать это. Я читал документы Кочана, Хиллегасса и Apple, и мне потребовалось почти 6 месяцев, чтобы понять некоторые концепции pgb, описанные здесь. Сейчас мне это кажется очевидным, но раньше точно не было. голосовать++ - person refulgentis; 04.11.2009