2012-01-20 86 views
1

我保留对example对象的引用,但我从不使用retain,newcopy我是否需要释放我不保留的对象?

@interface ExampleViewController : UIViewController 
{ 
    IBOutlet UILabel *example; 
} 

@end 

如果我在界面生成器连接UILabel对象example,保留计数为两个。但是,当我不连接它时,保留计数为零。我会认为我保留一个参考,并且观点保持另一个参考,因此我需要发布它。你怎么看?

回答

2

IBOutlet实例变量是一种特殊情况。在iOS中,每个IBOutlet实例变量在加载NIB时都会保留,所以您需要自己释放它们。

事实上,你应该特别注意在-viewDidUnload:之前发布和删除这些IBOutlets,否则当NIB重新加载时它们会泄漏。

请注意,这实际上与Mac OS X开发不同,其中IBOutlet不保留,除非它是没有父视图或窗口的顶级NIB对象。

因此,Apple现在建议通过属性而不是实例变量公开IBOutlets。这样,分销商的所有权就明确界定了。

@property (nonatomic, assign) IBOutlet UIButton* myButton; 
@property (nonatomic, retain) IBOutlet NSObject* someObject; 

myButton不必被释放; someObject将不得不被释放。在这两种情况下,您都有责任在-viewDidUnload:之间清理这些变量。

+0

还有两个问题,你已经得到我的接受。 1。)为什么连接到视图给它两个保留计数,而不这样做给我零?和2.)为什么我需要将IBOutlets设置为零? –

+0

你在你的问题中获得了retainCount权利;一个参考是由你,另一个由超级观点。 retainCount从不为零。如果你读了零就意味着该变量为零。释放它之后,您应该始终为零。这就是你知道变量不再指向有效对象的方式。没有这个,你会有一个悬挂指针指向一个不再存在的对象。 – Darren

+0

最后一个问题,所以我必须始终将我的IBOutlet实例变量设置为零,然后才能释放其他对象? –

1

如果你使用的是ARC,那么你不需要释放一个实例变量,因为它将在你的实例被释放时被释放。如果你不使用ARC,你应该写在你的ExampleViewController方法-dealloc这样:

- (void)dealloc 
{ 
    [example release]; 

    [super dealloc]; 
} 

请注意,如果您手动设置example不使用ARC,它不会自动保留。但是,由于您使用的是笔尖,因此在设置时会保留

+0

有道理。但是,为什么笔尖保持对象两次? –

+0

它不会保留它们两次。它将它设置为实例变量时保留该对象。该对象的*也*由其超视图保留,因此您可以预期在显示视图时保留计数为2,当视图解除分配或从超级视图中移除该对象时为1,并且一旦视图控制器被释放。 –

0

你需要的,如果你不使用ARC释放他们在- (void) dealloc,有一个属性你IBOutlet,你需要释放和nil他们viewDidUnload:

考虑为您的项目使用ARC(自动保留计数)。使用ARC,编译器负责保留计数,因此您不必实际不允许这样做。有一个重构将转换当前的项目。

+0

我没有iOS 5 SDK。 –

+0

为什么你不明白它?除了少数例外,ARC与iOS 4兼容。 –

+0

我没有这台机器的管理权限,而且那些更新软件的速度非常慢。 –

相关问题