Если вы следуете тому, что в настоящее время считается лучшей практикой, вы должны освободить свойства розетки, поскольку вы должны были сохранить их в наборе доступа:
@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.
Однако следует учитывать, что ваш контроллер может избавиться от своего пользовательского интерфейса и динамически перезагружать его по требованию (например, если у вас есть контроллер представления, который загружает представление из файла пера, но по запросу - скажем, скажем, под давлением памяти - освобождает его, ожидая, что он может быть перезагружен, если представление потребуется снова). В этой ситуации вы хотите убедиться, что при удалении основного вида вы также отказываетесь от прав собственности на любые другие торговые точки, чтобы их тоже можно было освободить. Для 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];
}