Скажем, у вас есть указатель 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