如果我有类似 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

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

笔记:以下注释仅适用于 3.0 之前的 iOS。对于 3.0 及更高版本,您应该简单地将 viewDidUnload 中的属性值清空。

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

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

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

补救措施是确保出口变量也设置为 nildealloc:

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

其他提示

我在苹果文档中找到了我想要的东西。简而言之,您可以将对象设置为您释放和保留的属性(或只是 @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 时不释放它,则会增加内存占用。

使用仪器 ObjectAlloc 图表查看更多详细信息

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

IB 所做的是查看您的 IBOutlet 以及它们的定义方式。如果您有一个类变量,IB 将为其分配对某个对象的引用,IB 将为您向该对象发送一条保留消息。

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

@property (nonatomic, retain) UILabel *lblExample;

因此,在其他情况下(无论是否使用属性),您应该在 dealloc 中调用release。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top