У меня есть UIViewController
, который имеет IBOutlet
для UILabel
с этикеткой, подключенной в XIB.
#import <Foundation/Foundation.h>
@interface MyViewController : UIViewController {
IBOutlet UILabel *aLabel;
}
@end
Согласно Программирование на iOS: Руководство по ранчо большого ботаника (2-е издание) глава 7
Когда [MyViewController] перезагружает свое представление, из файла XIB создается новый экземпляр UILabel.
Таким образом, рекомендуется выпустить метку в viewDidUnload
.
- (void)viewDidUnload {
[super viewDidUnload];
[aLabel release];
aLabel = nil;
}
Будучи программистом на C #, я понял, что присваивать nil / null вещам бессмысленно. Хотя я вижу, что в Objective-C это имеет больше смысла, это все же немного смягчает мое чувство эстетики кода *. Я удалил его, и все заработало нормально.
Однако, когда я пытался сделать аналогичную вещь с MKMapView
, ошибки приложения EXC_BAD_ACCESS
при попытке загрузить NIB.
#import <Foundation/Foundation.h>
@interface MyViewController : UIViewController {
IBOutlet MKMapView *mapView;
}
@end
- (void)viewDidUnload {
[super viewDidUnload];
[mapView release];
mapView = nil; // Without this line an exception is thrown.
}
Почему возникает ошибка, когда mapView
не установлен на nil
, но не когда aLabel
не установлен на nil
?
* Я понимаю, что мне нужно настроить эстетику кода под новый язык, но это требует времени.
Оказывается, я просто ошибся из-за того, что на aLabel
не ссылаются. Не уверен, что заставило меня думать, что это не так.
Однако это все еще оставляет вопрос о том, почему на них ссылаются, пока загружается NIB.
Когда поле или свойство установлено, сообщение об освобождении отправляется на старое значение (либо метод набора синтезированных свойств отправляет сообщение об освобождении, либо setValue:forKey:
отправляет сообщение, если это поле). Поскольку старое значение уже было освобождено, это приводит к EXC_BAD_ACCESS
.