首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用loadNibNamed: method的时候需要释放IBOutlets吗?

使用loadNibNamed: method的时候需要释放IBOutlets吗?
EN

Stack Overflow用户
提问于 2008-12-19 23:35:47
回答 3查看 15.8K关注 0票数 17

我有一个包含一个UIView和两个UILabel子视图的.xib文件,该文件链接到一个名为Note的类,并为每个标签相应地分配了outlets,该类的定义如下所示。

@interface Note : UIView {
    IBOutlet UILabel *time;
    IBOutlet UILabel *content;
}

我用下面的代码构造它

NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"Note" owner:self options:nil];
note = [nibViews lastObject];
[self addSubview:note];

现在,在我的Note类dealloc阶段,我既没有发布时间,也没有发布内容,但我想知道我是否应该发布?

- (void)dealloc {
    [super dealloc];
}

我假设我没有这样做,因为我没有在代码中显式地保留这些对象,也没有将它们合成到getter/getter中。但是我对nib解压还不够了解,不知道我是否应该在我的dealloc阶段发布这些东西?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-12-20 00:39:30

这在iPhone上是正确的,但在Mac上就不正确了。

但是,您可能希望重新编写此代码。假设视图将是从nib加载的最后一个对象是不安全的。相反,我建议您要么将其连接到视图控制器中的" Note“出口,要么扫描列表中作为Note的子类的对象。(如果您要加载多个Notes并使用outlet选项,只需确保在加载另一个Notes之前添加了一个Notes。)

票数 2
EN

Stack Overflow用户

发布于 2008-12-22 03:23:48

你确实需要释放它。看见

但是,在重建对象层次结构时,UIKit会使用setValue:forKey:方法重新建立对象之间的连接,该方法使用可用的设置器方法,如果没有可用的设置器方法,则默认情况下会保留对象。在Nib Object Retention

换句话说,因为您没有将这些条目指定为@property (它隐式地声明了setter),或者没有直接提供setter,所以没有可用的setter方法,这一段的最后一部分适用-默认情况下对象是保留的。

您应该在dealloc()方法中,使用以下命令将所有IBOutlets设置为nil

self.outletName = nil;

如果未定义NSAutoreleasePool,则setValue将自动释放旧值(如果在线程中运行,请确保您有setter )。如果定义了setter,它将执行您定义的任何行为。无论哪种方式,设置为nil都会做正确的事情,并确保不会发生内存泄漏。不要这样做

outletName = nil;

这将直接设置成员变量,并绕过调用setValue。

有关更多详细信息,请参阅NSObject setValue:forKey的文档。

运行性能工具(Leaks)不会显示泄漏,但您可以通过查看当前运行的已分配内存总量来验证是否确实存在泄漏。

cf The Airsource - Memory Management and NIBs

票数 0
EN

Stack Overflow用户

发布于 2012-05-09 06:42:17

您将无法将它们从内存中取出,除非您将IBOutlets声明为属性并将其合成为ivar:

@interface Note : UIView {
    IBOutlet UILabel *time;
    IBOutlet UILabel *content;
}

@property (nonatomic, retain) IBOutlet UILabel *time;
@property (nonatomic, retain) IBOutlet UILabel *content;

@end


@implementation Note
@synthesize time, content;

// your methods

- (void)dealloc {
     [time release], time = nil;
     [content release], content = nil;
     [super dealloc];
}

@end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/382576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档