使用loadNibNamed:方法时是否需要释放IBOutlets?

sea*_*her 17 iphone objective-c

我有一个.xib文件包含一个UIView和2个UILabel子视图链接到一个名为Note的类,其中适当地分配给每个标签的出口,该类的定义包含以下内容.

@interface Note : UIView {
    IBOutlet UILabel *time;
    IBOutlet UILabel *content;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码构建它

NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"Note" owner:self options:nil];
note = [nibViews lastObject];
[self addSubview:note];
Run Code Online (Sandbox Code Playgroud)

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

- (void)dealloc {
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

我假设我没有,因为我没有在我的代码中的任何地方明确地保留这些对象,并且我没有将它们合成到getter/setter中.但是我对nib unarchiving知道我是否应该在我的dealloc阶段释放这些内容还不够了解?

pio*_*r78 14

即使您没有编写或合成访问器方法,也应该发布IBOutlet .NIB生命周期文档说尽管未归档的对象最初设置为自动释放,但当UIKit挂钩所有IBOutlet连接绑定时,它们的保留计数会增加1.因此,您需要在完成后通过释放手动递减.

UIKit做这件事并不明显,所以你可能会认为你可以放弃setter/getter方法,并相信一切都是自动释放的.但事实并非如此.

请注意,Interface Builder模板显式释放任何IBOutlet,因此您应该同样对待任何添加的IBOutlet.


Bre*_*don 2

这对于 iPhone 来说是正确的;但在 Mac 上它是不正确的。

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

  • 不保证解档时的顺序。例如,在 iPhone OS 2.1 和 2.2 之间,加载时放置在 xib 中的单个 UITableViewCell 在数组中的不同位置返回(即使只有一个对象,loadNibNamed 返回的数组中也有多个元素)。 (4认同)