Cocoa垃圾收集和保留周期
我对Cocoa/Objective-C还很陌生,所以我希望能解释我的问题。Cocoa垃圾收集和保留周期,cocoa,xcode4.2,Cocoa,Xcode4.2,我对Cocoa/Objective-C还很陌生,所以我希望能解释我的问题。 我在Xcode 4.2中创建了一个垃圾收集应用程序,我的应用程序委托创建了一个授权对象(我的类),该对象将创建并提供一个密码对象(我的类/xib) 密码窗口接受输入,批准或拒绝并关闭。从那里,Authorize对象将关闭,控制权返回给app委托。当密码nib显示为模式窗口时 作为测试,我在初始化每个对象和完成每个对象时都包含一条NSLog语句。由于某些原因,我的密码对象尚未最终确定。授权对象已完成 我甚至删除了Autho
我在Xcode 4.2中创建了一个垃圾收集应用程序,我的应用程序委托创建了一个授权对象(我的类),该对象将创建并提供一个密码对象(我的类/xib) 密码窗口接受输入,批准或拒绝并关闭。从那里,Authorize对象将关闭,控制权返回给app委托。当密码nib显示为模式窗口时 作为测试,我在初始化每个对象和完成每个对象时都包含一条NSLog语句。由于某些原因,我的密码对象尚未最终确定。授权对象已完成 我甚至删除了Authorize对象,直接从app委托创建了密码,但仍然没有最终确定 我已经研究并尝试了我能想到的一切/任何方法来完成此对象(我假设如果此对象未完成,它不会释放此对象的内存)。
有人能提出一些我可能忽略的建议吗 更新:
经过更多的实验,我发现了问题。我创建了一个只有AppDelegate和WindowController/Nib文件的新项目。使用与GC和build相同的设置,我能够消除所有问题,直到发现问题。
我的密码笔尖中有一个NSSecureText字段。无论出于何种原因,当窗口关闭时,这不会释放。
在关闭窗口之前,我添加了行[textField removeFromSuperview],并调用了finalize方法。
我不确定这是否是最好的方法,但它似乎有效。
对于ARC选项,我的印象是项目需要达到10.7或更高的目标才能使用ARC。我希望最低目标为10.5。
也许我错了。如果我是,请告诉我。如果没有调用
finalize
,则说明您仍然有一个强引用,或者GC没有运行。由于其他对象完成,显然GC正在运行。因此,你必须寻找谁持有一份强有力的推荐信。对所有以Password
类型变量作为起点的人审核您的代码。确保它没有卡在某个字典或数组中。确保它没有被尚未消失的视图控制器或视图持有
如果可能的话,切换到ARC而不是GC。这可能是完全一样的,但其他一切都要好得多。GC是一个有趣的实验,我们很多人都忽略了,但ARC肯定是平台的发展方向。关于(更新)问题的这一部分: 对于ARC选项,我的印象是项目需要达到10.7或更高的目标才能使用ARC。我希望最低目标是10.5。 也许我错了。如果我是,请让我知道 您可以使用ARC以64位Snow Leopard或更高版本为目标,但如果要执行此操作,则不能使用调零弱引用-请改用assign properties,并将任何显式声明的IVAR标记为
\uuuuuunsafe\uunrepaired
。(有关详细信息,请参阅。)