Если вы будете следовать, что в настоящее время считаются наилучшей практикой, вы должны свойства на выходе релиза, потому что вы должны сохранить их в наборе аксессоре:
@interface MyController : MySuperclass {
Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end
@implementation MyController
@synthesize uiElement;
- (void)dealloc {
[uiElement release];
[super dealloc];
}
@end
Преимущества этого подхода состоит в том, что оно делает семантику управления памятью ясной и ясной, и работает последовательно на всех платформах для всех файлов nib.
Примечание. Следующие комментарии относятся только к iOS до 3.0. С 3.0 и более поздними версиями вместо этого вы должны просто игнорировать значения свойств в viewDidUnload.
Одно из требований здесь заключается в том, что ваш контроллер может распоряжаться своим пользовательским интерфейсом и динамически загружать его по требованию (например, если у вас есть контроллер представления, который загружает представление из файла nib, но по запросу - скажем, под давлением памяти - освобождает его, ожидая, что его можно перезагрузить, если снова потребуется просмотр). В этой ситуации вы хотите убедиться, что при удалении основного вида вы также откажетесь от владения любыми другими выходами, чтобы их тоже можно было освободить. Для UIViewController, вы можете справиться с этой проблемой путем переопределения setView:
следующим образом:
- (void)setView:(UIView *)newView {
if (newView == nil) {
self.uiElement = nil;
}
[super setView:aView];
}
К сожалению, это приводит к появлению дополнительного выпуска.Поскольку UIViewController в настоящее время реализует свой метод dealloc
, используя метод доступа setView:
(а не просто просто отбрасывая переменную напрямую), self.anOutlet = nil
будет вызываться в dealloc
, а также в ответ на предупреждение о памяти ... Это приведет к сбою в dealloc
.
Лекарство для обеспечения того, чтобы переменные выходные также устанавливаются в nil
в dealloc
:
- (void)dealloc {
// release outlets and set variables to nil
[anOutlet release], anOutlet = nil;
[super dealloc];
}
Если у нас есть свойство сохранения, мы не могли бы упростить это, просто говоря self.uiElement = nil; Во всех местах, которые мы хотим отпустить, поскольку это свойство сохранения, оно должно фактически освободить его должным образом, а также установить его на нуль без проблем, одно из преимуществ сохраняемых свойств. – 2010-11-24 13:44:26
Обычно вы выполняете `self.uiElement = nil;` в `viewDidUnload` не в` setView: `. И было бы яснее просто называть `self.anOutlet = nil;` в dealloc. – 2011-01-15 14:38:38