【问题标题】:memory management with outlets and properties in view controllers在视图控制器中使用插座和属性进行内存管理
【发布时间】:2011-04-10 00:25:52
【问题描述】:

大家好,很抱歉再次击败内存管理(死)马。我知道这个问题已经在 SO 上被问过好几次了,但我觉得那里的所有线程仍然缺少两条信息。让我提出我所知道的以节省大家一些时间。

1) 当你创建一个 IBOutlet 时,你的视图控制器会自动保留这个出口。

1a) 当您不创建插座时,“框架”(笔尖?)会为您释放您的对象(如 uilabels 或 uiviews)。

2) 当你执行 self.myOutlet = nil 时,你有效地释放了一个出口(前提是你已经正确地合成了你的属性)。这是因为 setter 释放了 outlet 并将其分配给 nil。

我不知道的:

1) 主要问题:如果您在 viewDidUnLoad 中执行 self.myOutlet = nil,您还需要在 dealloc 中执行任何操作吗?你能假设 viewDidUnload 总是在 dealloc 之前调用吗?(因此你保留的视图被释放了?)

2) 如果你不为那个插座合成一个属性,会发生什么?框架不应该自动释放它吗?(因为你没有保留属性)如果你必须释放它,你怎么做以及在哪里(在viewDidUnload或dealloc中)?

如果有什么问题,请指出来。任何澄清都会非常有帮助。

【问题讨论】:

    标签: iphone cocoa-touch memory-management


    【解决方案1】:

    (#1) Apple 文档说两者都做

    另外,由于UIViewController中有dealloc的实现细节,dealloc中还需要设置outlet变量为nil:

    http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html

    (#2) 如果你不合成一个属性,你仍然需要创建一个属性,并且它更好地保留——阅读链接。 UI 对象被创建、自动释放并设置了 outlet 属性(应该保留)。没有发布需要你,因为他们已经完成了他们应该做的发布——你保留了,所以你必须释放(在 viewDidUnload 和 dealloc 中)

    【讨论】:

    • hi lou,感谢您的回复:我很困惑,因为关于在 dealloc 中将出口变量设置为 nil 的引用在本节中说:“注意:在 3.0 之前的 iOS 上......你应该在 setView: 中将 outlets 设置为 nil,如本例所示:”然后它说,就像您在上面引用的那样,“此外……”所以这不是 iOS 3.0 之前的细节的一部分吗?因此,我从中得出的结论是,当您拥有保留的属性时,在 viewDidUnload AND dealloc 期间,您必须执行 self.outlet = nil,而无需其他任何操作来正确管理属性。没有属性就没有网点。对吗?
    • 我对该注释的阅读是只有 setView 部分适用于 iOS 3.0,因为 viewDidUnload 不存在。第二部分适用于每个版本。是的,为 IBOutlets 使用 @property。
    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2012-08-03
    • 1970-01-01
    • 2012-11-11
    相关资源
    最近更新 更多