【问题标题】:Cocoa Garbage Collection and Retain Cycles可可垃圾收集和保留周期
【发布时间】:2012-01-14 16:10:33
【问题描述】:

我对 Cocoa/Objective-C 还是很陌生,所以我希望我能解释一下我的问题。
我在 Xcode 4.2 中创建了一个垃圾收集应用程序我有我的应用程序委托,它创建了一个授权对象(我的类),这个对象将创建并呈现一个密码对象(我的类/xib)。

密码窗口接受输入并批准或拒绝并关闭。从那里,Authorize 对象将关闭并将控制权返回给应用程序委托。当密码 nib 显示为模态窗口时。

作为测试,我在每个对象初始化和最终确定时都包含一个 NSLog 语句。出于某种原因,我的 Password 对象尚未最终确定。授权对象已完成。

我什至消除了 Authorize 对象并直接从应用程序委托创建了密码 - 仍然没有最终确定。

我已经研究并尝试了我能想到的一切/任何事情来完成这个对象(我假设如果它没有完成,它不会释放这个对象的内存)。
任何人都可以提出一些我可能忽略的东西吗?

更新:
经过更多的尝试,我发现了问题所在。我创建了一个只有 AppDelegate 和 WindowController/Nib 文件的新项目。对 GC 和构建使用相同的设置,我能够消除所有问题,直到发现问题。
我的密码笔尖中有一个 NSSecureTextfield。无论出于何种原因,当窗口关闭时,它都没有释放。
我在关闭窗口之前添加了行 [textField removeFromSuperview] 并调用了 finalize 方法。
我不确定这是否是最好的方法,但它似乎有效。

对于 ARC 选项,我的印象是该项目需要以 10.7 或更高版本为目标才能使用 ARC。我希望将 10.5 作为最低目标。
也许我错了。如果我是,请告诉我。

【问题讨论】:

    标签: cocoa xcode4.2


    【解决方案1】:

    如果 finalize 没有被调用,那么要么你仍然有一个强引用,要么 GC 没有运行。由于其他对象最终确定,显然 GC 正在运行。因此,您将不得不寻找谁拥有强大的参考。为拥有Password 类型变量的每个人审核您的代码作为开始。确保它没有卡在某个地方的字典或数组中。确保它没有被视图控制器或尚未消失的视图持有。

    如果可能的话,切换到 ARC 而不是 GC。这可能完全相同,但其他一切都好得多。 GC 是一个有趣的实验,我们很多人都忽略了,但 ARC 绝对是该平台的发展方向。

    【讨论】:

      【解决方案2】:

      关于(更新的)问题的这一部分:

      对于 ARC 选项,我的印象是该项目需要以 10.7 或更高版本为目标才能使用 ARC。我希望至少以 10.5 为目标。 也许我错了。如果我是,请告诉我。

      您可以使用 ARC 定位 64 位 Snow Leopard 或更高版本,但如果您这样做,则不能使用归零弱引用 - 如果您想走这条路,请改用分配属性并将任何显式声明的 ivars 标记为 __unsafe_unretained . (更多信息请参见this question。)

      【讨论】:

        猜你喜欢
        • 2017-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多