我需要释放xib资源吗?

如果我有一个像UILabel链接到一个xib文件,我需要释放它在我的看法dealloc? 我问的原因是我没有分配,这让我觉得我不需要释放它呢? 例如(在标题中):

IBOutlet UILabel *lblExample; 

在执行中:

 .... [lblExample setText:@"whatever"]; .... -(void)dealloc{ [lblExample release];//????????? } 

如果您遵循现在认为是最佳实践的方法,则应该释放出口属性,因为您应该将它们保留在set访问器中:

 @interface MyController : MySuperclass { Control *uiElement; } @property (nonatomic, retain) IBOutlet Control *uiElement; @end @implementation MyController @synthesize uiElement; - (void)dealloc { [uiElement release]; [super dealloc]; } @end 

这种方法的优点在于它使内存pipe理语义清晰明了, 并且在所有nib文件的所有平台上一致地工作

注意:以下评论仅适用于3.0之前的iOS。 3.0和更高版本,你应该改为在viewDidUnload中的属性值。

这里的一个考虑是,当你的控制器可能会处理它的用户界面,并根据需要dynamic地重新加载它(例如,如果你有一个视图控制器从一个nib文件加载视图,但是根据请求 – 例如在内存压力下 – 释放它,期望如果再次需要视图,可以重新加载它)。 在这种情况下,您要确保在处理主视图时还放弃了其他任何网点的所有权,以便它们也可以被释放。 对于UIViewController,你可以通过覆盖setView:来处理这个问题setView:如下:

 - (void)setView:(UIView *)newView { if (newView == nil) { self.uiElement = nil; } [super setView:aView]; } 

不幸的是,这引起了进一步的问题。 因为UIViewController当前使用setView: accessor方法实现其dealloc方法(而不是简单地直接释放variables), self.anOutlet = nil将在dealloc中以及响应于内存警告中调用…这将导致在dealloc崩溃。

补救措施是确保outlet分配variables在dealloc中也设置nil

 - (void)dealloc { // release outlets and set variables to nil [anOutlet release], anOutlet = nil; [super dealloc]; } 

我在Apple文档中find了我正在寻找的东西。 简而言之,您可以将对象设置为您释放和保留的属性(或者只是@property,@synthesize),但是您不必像UILabels那样:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/chapter_3_section_4.html#//apple_ref/doc/uid/10000051i-CH4-SW18

 [anOutlet release], anOutlet = nil; 

如果你已经写了setView:部分是完全多余的。

如果你不释放dealloc它会增加内存占用。

用仪器的ObjectAllocgraphics在这里看到更多的细节

相关: 了解Cocoa / Objective C的引用计数

从某种意义上来说,您可以通过在IB中创build标签来分配标签。

IB做什么,看你的IBOutlets,以及它们是如何定义的。 如果你有一个IB类的variables来分配一个对象的引用,IB会发送一个保留消息给你的对象。

如果您正在使用属性,则IB将使用您必须设置该值的属性,而不是显式保留该值。 因此,您通常会将IBOutlet属性标记为保留:

 @property (nonatomic, retain) UILabel *lblExample; 

因此在以太情况下(使用属性或不),你应该在你的dealloc中调用release。

任何IBOutlet都是你的Nib主视图的子视图,不需要被释放,因为它们将在创build对象时发送autorelease消息。 你需要在你的dealloc中释放的唯一IBOutlet是控制器或其他NSObject的顶级对象。 在上面的Apple文档中提到了这一点。

如果您不将IBOutlet设置为属性,而只是将其设置为实例variables,则仍然必须将其释放。 这是因为在initWithNib时,内存将分配给所有IBOutlet。 所以这是你必须释放的特殊情况之一,即使你没有保留或分配任何代码的内存。