我有一个UIViewController
有一个IBOutlet
for a UILabel
标签已连接到 XIB 中。
#import <Foundation/Foundation.h>
@interface MyViewController : UIViewController {
IBOutlet UILabel *aLabel;
}
@end
根据iOS 编程:大书呆子牧场指南(第二版) http://bignerdranch.com/book/ios_programming_the_big_nerd_ranch_guide_nd_edition_第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
.