2008-12-19 45 views
17

我有一个.xib文件,其中包含一个UIView和2个UILabel子视图,它们链接到一个名为Note的类,并将插座适当地分配给每个标签,该类的定义包含以下内容。使用loadNibNamed:方法时是否需要释放IBOutlets?

@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]; 

,在我注意类的dealloc阶段,我没有释放任何时间或内容,但如果我应该我想知道?

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

我假设我不会,因为我没有明确地在我的代码保留这些对象的任何地方,我不合成这些进入的getter/setter方法。但是我不知道关于笔尖的解体问题,知道我是否应该在我的dealloc阶段释放这些信息?

回答

2

这是iPhone的正确;尽管如此,它在Mac上并不正确。

但是,您可能希望重写此代码。假设视图将是从笔尖加载的最后一个对象,这是不安全的。我建议您将它连接到视图控制器中的“笔记”插座,或者扫描列表以查找注释子类的对象。 (如果您正在加载多个Notes并使用插座选项,只需确保在加载另一个Note之前添加一个Note。)

+0

你是什么意思我不能保证这将是最后一个对象?你的意思是因为它可能以你想要的任何顺序来订购笔尖的顶层,或者在取消存档时订单可以从界面生成器中出现的内容改变。 – seanalltogether 2008-12-20 03:34:57

-6

我相信你是对的。有关详细信息,请参阅下面的文档链接。

文档:

+0

答案是不正确的,在这个线程的其他职位说明和记录由Apple。 – amok 2011-01-01 03:11:03

+1

此答案对于Mac OS X是正确的,但不适用于iOS。看看“顶层对象”下的这个链接。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html#//apple_ref/doc/uid/TP40004998-SW2 – 2011-01-15 14:34:01

0

您需要释放它。请参阅

“但是,重建对象层次结构时,如果没有setter方法可用,UIKit将使用setValue:forKey:方法重新建立对象之间的连接,该方法使用可用的setter方法或默认保留该对象。在Nib Object Retention

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

你应该在你的dealloc()方法,将所有IBOutlets至零使用

self.outletName = nil; 

如果没有setter定义,然后setValue方法将自动释放旧值(确保你有一个NSAutoreleasePool如果在运行一个线程)。如果定义了setter,它将执行你定义的任何行为。无论哪种方式,设置为零将做正确的事情,并确保你没有内存泄漏。不要这样做

outletName = nil; 

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

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

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

CF The Airsource - Memory Management and NIBs

14

即使你不或合成存取方法,您应该释放一个IBOutlet。 NIB生命周期文档说虽然未归档的对象最初设置为自动释放,但当UIKit挂接所有IBOutlet连接绑定时,它们上的保留计数会被额外的1增加。因此,您需要在完成后通过发布手动递减。

UIKit会这样做并不明显,所以你可能会认为你可以关闭setter/getter方法并相信所有东西都是自动释放的。但事实并非如此。

请注意,Interface Builder模板显式释放任何IBOutlets,所以您添加的任何应该同样处理。

0

你将不能够带他们出去的内存,除非你声明IBOutlets作为属性,并将其合成到高德:

@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 
相关问题