iphone - 我需要释放xib资源吗?

标签 iphone objective-c cocoa-touch

如果我有类似 UILabel 链接到 xib 文件的东西,我是否需要在 View 的 dealloc 上释放它?我问的原因是因为我不分配它,这让我觉得我也不需要释放它? 例如(在标题中):

IBOutlet UILabel *lblExample;

在实现中:

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

-(void)dealloc{
    [lblExample release];//?????????
}

最佳答案

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

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


@implementation MyController

@synthesize uiElement;

- (void)dealloc {
    [uiElement release];
    [super dealloc];
}
@end

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

注意:以下评论仅适用于 3.0 之前的 iOS。对于 3.0 及更高版本,您应该简单地将 viewDidUnload 中的属性值设为 nil。

不过,这里需要考虑的一个问题是,您的 Controller 可能会处理其用户界面并根据需要动态重新加载它(例如,如果您有一个 View Controller 从 nib 文件加载 View ,但应请求 - 比如说在内存压力下——释放它,期望在再次需要 View 时可以重新加载它)。在这种情况下,您要确保当主视图被处置时,您也放弃任何其他导出的所有权,以便它们也可以被解除分配。对于 UIViewController,您可以通过覆盖 setView: 来处理此问题,如下所示:

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

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

补救方法是确保在dealloc中也将outlet变量设置为nil:

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

关于iphone - 我需要释放xib资源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61838/

相关文章:

iphone - 如何在 iOS 中暂时隐藏 GADBannerView?

iphone - ios UIActionSheet 取消按钮不能正常工作

ios - 为什么我的 NSOperationQueue 在暂停时不停止执行?

iphone - iPhone 中的 UITableView 具有大量(可能有 100 万个条目)数据

ios - 在 UITableViewCell 的 UIButton 位置插入 UIView

ios - 使用核心数据时在 UITableView 的顶部添加一个新行

iphone - 如何在 iPad 和 iPhone 之间使用不同的 css 样式

objective-c - 如何将主包内的目录复制到 NSPasteBoard?

具有动态高度的 iOS UIView 取决于内部元素的数量

iphone - 如何防止 UILabel 被 '...' 切断