37

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

IBOutlet UILabel *lblExample;

在实施中:

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

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

8 回答 8

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

这种方法的优点是它使内存管理语义明确而清晰,并且它可以在所有平台上对所有 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.

补救措施是确保出口变量也设置为nilin dealloc

- (void)dealloc {
    // release outlets and set variables to nil
    [anOutlet release], anOutlet = nil;
    [super dealloc];
}
于 2008-10-10T15:41:00.363 回答
4

我在 Apple 文档中找到了我想要的东西。简而言之,您可以将对象设置为您释放和保留的属性(或只是@property、@synthesize),但您不必为 UILabel 之类的东西:

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

于 2008-09-15T06:47:20.910 回答
3

[anOutlet release], anOutlet = nil;

如果您正确编写了 setView: 部分,则完全是多余的。

于 2009-02-20T01:26:52.467 回答
1

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

使用仪器 ObjectAlloc 图在此处查看更多详细信息

于 2010-02-19T11:05:49.990 回答
0

相关:使用 Cocoa / Objective C 理解引用计数

于 2008-09-15T03:58:02.033 回答
0

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

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

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

@property (nonatomic, retain) UILabel *lblExample;

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

于 2008-09-15T04:49:13.640 回答
0

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

于 2008-09-15T13:44:15.273 回答
0

If you dont set the IBOutlet as a property but simply as a instance variable, you still must release it. This is because upon initWithNib, memory will be allocated for all IBOutlets. So this is one of the special cases you must release even though you haven't retained or alloc'd any memory in code.

于 2012-04-13T04:28:13.523 回答