我是否需要释放我不保留的对象?

时间:2012-01-20 05:10:10

标签: objective-c memory-management

我保留对example对象的引用,但我从不使用retainnewcopy

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

@end

如果我将Interface Builder中的UILabel对象连接到example,则保留计数为2。但是当我没有连接它时,保留计数为零。我认为我保留一个引用,并且视图保留另一个,因此我需要释放它。你觉得怎么样?

3 个答案:

答案 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,编译器会处理保留计数,因此实际上不允许这样做。有一个重构将转换当前项目。