【问题标题】:ARC, Nib files, and releasing top-level objectsARC、Nib 文件和释放顶级对象
【发布时间】:2012-02-23 11:22:47
【问题描述】:

我有一个自定义控制器对象,它可以像这样加载 Nib 文件:

- (id)init {
    self = [super init];
    if (self) {
        [NSBundle loadNibNamed:@"AccountSetup" owner:self];
    }
    return self;
}

Nib 文件包含一个 NSTabView 项目。我注意到当我的自定义控制器对象被释放时,标签视图并没有随之释放。

我的自定义控制器对象扩展了NSViewController,根据我在文档(1) 中读到的内容,如果文件的所有者扩展了NSViewController,则应该自动释放 Nib 中的顶级对象:

如果文件的所有者不是 NSWindowController 的实例或 NSViewController,那么你需要减少的引用计数 自己的顶级对象。

如果我在自定义控制器的dealloc 中释放选项卡视图,它会正确消失,但我想知道我是否遗漏了什么,或者在这种特殊情况下文档不是很精确。

1) https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW18

【问题讨论】:

    标签: cocoa memory-management automatic-ref-counting nib


    【解决方案1】:

    如果您的控制器是NSViewController 的子类,那么您使用它不正确并绕过了它的笔尖加载机制。你应该这样做:

    - (id)init 
    {
        self = [super initWithNibName:@"AccountSetup" bundle:nil];
        if (self) 
        {
            //perform any initializations
        }
        return self;
    }
    

    通过绕过initWithNibName:bundle: 方法并直接使用NSBundle 方法,可以防止NSViewController 管理nib 中的顶级对象。

    【讨论】:

      猜你喜欢
      • 2012-05-04
      • 2013-11-29
      • 2023-03-19
      • 2013-09-07
      • 2012-10-01
      • 1970-01-01
      • 2013-09-14
      • 2012-02-28
      • 1970-01-01
      相关资源
      最近更新 更多