我保留对example
对象的引用,但我从不使用retain
,new
或copy
。
@interface ExampleViewController : UIViewController
{
IBOutlet UILabel *example;
}
@end
如果我将Interface Builder中的UILabel
对象连接到example
,则保留计数为2。但是当我没有连接它时,保留计数为零。我认为我保留一个引用,并且视图保留另一个,因此我需要释放它。你觉得怎么样?
答案 0 :(得分:2)
IBOutlet
个实例变量是一个特殊情况。在iOS中,每个IBOutlet实例变量在加载NIB时都会保留,因此您需要自己发布它们。
事实上,您应该特别注意在-viewDidUnload:
中释放并取消这些IBOutlet,否则在重新加载NIB时它们会泄漏。
请注意,这实际上与Mac OS X开发不同,其中IBOutlet不会被保留,除非它是没有父视图或窗口的顶级NIB对象。
出于这个原因,Apple现在建议通过属性而不是实例变量公开IBOutlets。这样,出口的所有权就明确了。
@property (nonatomic, assign) IBOutlet UIButton* myButton;
@property (nonatomic, retain) IBOutlet NSObject* someObject;
myButton
不一定要被释放;必须释放someObject
。在这两种情况下,您都有责任在-viewDidUnload:
中清理这些变量。
答案 1 :(得分:1)
如果您正在使用ARC,那么您不需要释放实例变量,因为它将在您的实例被取消分配时释放。如果您不使用ARC,则应在-dealloc
中编写ExampleViewController
方法:
- (void)dealloc
{
[example release];
[super dealloc];
}
请注意,如果您在不使用ARC的情况下手动设置example
,则不会自动保留。但是,由于您使用的是笔尖,因此 会在设置时保留。
答案 2 :(得分:0)
如果您没有使用ARC并且- (void) dealloc
有一个属性,则需要在IBOutlet
中释放它们,并且您需要在viewDidUnload:
中释放并取消它们。< / p>
考虑为您的项目使用ARC(自动保留计数)。使用ARC,编译器会处理保留计数,因此实际上不允许这样做。有一个重构将转换当前项目。