【问题标题】:Which "Top-Level Objects" is Apple talking about in the Memory Management Programming Guide?Apple 在内存管理编程指南中谈论的是哪些“顶级对象”?
【发布时间】:2010-10-22 17:12:37
【问题描述】:

Memory Management Programming Guide for Cocoa Apple 中谈到了顶级对象。他们说,我需要为他们每个人提供一个 Outlet。

如果您有任何顶级对象 不要存放在网点,但是,你 必须保留返回的数组 通过 loadNibNamed:owner:options: 方法或数组内的对象 以防止这些对象被 提前释放。

那么“顶级对象”到底是什么意思?我会说他们谈论根视图和窗口。还有什么?这个提示是否仅适用于我想手动加载笔尖的情况?或者它适用于任何笔尖和任何情况?

【问题讨论】:

  • +1 我真的很喜欢你关于内存管理的问题。很多时候,我们认为我们收到的内存管理实践是理所当然的,而没有提醒自己这些实践背后的原因。综上所述,您最近的 SO 帖子值得成为 Apple 的 iPhone 内存管理常见问题解答!
  • 谢谢!我相信他们也会帮助其他人。

标签: iphone uikit nib xib


【解决方案1】:

是的,这是关于手动加载 Nib 的情况,否则您不会调用 loadNibNamed:owner:options:

【讨论】:

  • IIRC 对于 Mac 来说是这样,但对于 UIKit,除了 -view 之外,您还必须在 UIViewController 中保留所有顶级对象,否则它会在加载后自动释放。还是我记错了这里的区别?
【解决方案2】:

顶级对象是出现在 Interface Builder 的主 nib 窗口中的对象,文件的所有者和应用程序除外。

【讨论】:

  • 实际上,至少在 MacOS 上,应用程序也是顶级对象。 loadNibNamed:owner:options: 返回的 NSTopLevelObjects 数组,出于某种奇怪的原因,还包括 NSApplication。
【解决方案3】:

在窗口中出现的具有文件所有者、第一响应者、视图的对象是顶级对象。您添加到视图中的任何内容都将成为子视图 - 所有子视图都由它们的直接父视图保留,因此它们不需要在其他地方保留。视图本身由视图控制器保留,因此不需要保留。

如果您添加非视图对象,或者您没有立即放入主视图的视图(例如当前未显示的工具栏按钮),您需要保留它们,否则它们将被释放。我首选的方法是使用 @property 使用 IBOutlets,如下所示:

@property(nonatomic, retain) IBOutlet UIBarButtonItem * myButton;

这会导致 -setMyButton: 在文件所有者上被调用(如果此代码在文件所有者中)并且通过 IB 连接的对象被发送到存储在此属性中。

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 2021-06-10
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多