我需要释放xib资源吗?

rus*_*elf 37 iphone cocoa-touch objective-c

如果我有一个像UILabel链接到xib文件的东西,我是否需要在我的视图dealloc上发布它?我问的原因是因为我没有分配它,这让我觉得我不需要释放它?例如(在标题中):

IBOutlet UILabel *lblExample;
Run Code Online (Sandbox Code Playgroud)

在实施中:

....
[lblExample setText:@"whatever"];
....

-(void)dealloc{
    [lblExample release];//?????????
}
Run Code Online (Sandbox Code Playgroud)

mma*_*alc 35

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

@interface MyController : MySuperclass {
    Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end


@implementation MyController

@synthesize uiElement;

- (void)dealloc {
    [uiElement release];
    [super dealloc];
}
@end
Run Code Online (Sandbox Code Playgroud)

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

注意:以下注释仅适用于3.0之前的iOS.对于3.0及更高版本,您应该在viewDidUnload中简单地取出属性值.

但是,这里需要考虑的一点是,您的控制器可能会处理其用户界面并按需动态重新加载它(例如,如果您有一个视图控制器从nib文件加载视图,但是根据请求 - 例如在内存压力下 - 释放它,期望在再次需要视图时可以重新加载它.在这种情况下,您希望确保在处理主视图时您还放弃任何其他商店的所有权,以便它们也可以被取消分配.对于UIViewController,您可以通过覆盖来处理此问题,setView:如下所示:

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

不幸的是,这引发了另一个问题.因为UIViewController当前dealloc使用setView:访问器方法实现其方法(而不是简单地直接释放变量),所以self.anOutlet = nil将调用dealloc以及响应内存警告...这将导致崩溃dealloc.

补救的办法是确保出口变量也设置nildealloc:

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

  • 你不应该打电话给self.anOutlet = nil; 在dealloc.在dealloc中调用访问器是不好的做法. (2认同)