【发布时间】:2011-09-06 10:43:11
【问题描述】:
我有一个UIViewController,其中有一个IBOutlet 对应一个UILabel,标签在XIB 中连线。
#import <Foundation/Foundation.h>
@interface MyViewController : UIViewController {
IBOutlet UILabel *aLabel;
}
@end
根据iOS Programming: The Big Nerd Ranch Guide (2nd Edition)第7章
当 [MyViewController] 重新加载其视图时,会从 XIB 文件中创建一个新的 UILabel 实例。
因此建议在viewDidUnload释放标签。
- (void)viewDidUnload {
[super viewDidUnload];
[aLabel release];
aLabel = nil;
}
作为一名 C# 程序员,我一直认为将 nil/null 分配给事物是毫无意义的。虽然我可以看到它在 Objective-C 中更有意义,但它仍然使我对代码美学的感觉略有*。我删除了它,一切正常。
但是,当我尝试对 MKMapView 执行类似操作时,在尝试加载 NIB 时出现应用程序错误 EXC_BAD_ACCESS。
#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。
【问题讨论】:
-
已根据给出的错误更新。
-
从 iOS 6.0 开始,
viewDidUnload已折旧。在内存不足的情况下不再清除视图,因此永远不会调用此方法。
标签: iphone objective-c ios cocoa-touch uikit