我对Cocoa / Objective-C还很陌生,所以我希望我能解释一下我的问题。
我在Xcode 4.2中创建了一个Garbage Collected应用程序我有我的app委托创建了一个Authorize对象(我的类),这个对象将创建并呈现一个Password对象(我的类/ xib)。
密码窗口接受输入并批准或拒绝并关闭。从那里,Authorize对象将关闭并控制返回给应用程序委托。当密码笔尖显示为模态窗口时。
作为测试,我在每个对象初始化和最终确定时都包含一个NSLog语句。由于某种原因,我的密码对象尚未最终确定。授权对象已完成。
我甚至删除了Authorize对象并直接从应用代表创建了密码 - 仍然没有最终确定。
我已经研究并尝试了所有我能想到的东西来让这个对象最终确定(我假设它没有为这个对象释放内存,如果它没有最终确定的话)。
任何人都可以提出一些我可能忽略的事情吗?
更新
经过更多的实验,我发现了问题。我创建了一个只有AppDelegate和一个WindowController / Nib文件的新项目。使用与GC和构建相同的设置,我能够消除所有内容,直到找到问题为止
我的密码笔尖中有一个NSSecureTextfield。无论出于何种原因,窗户关闭时都没有释放
我在关闭窗口之前添加了[textField removeFromSuperview]行,并调用了finalize方法
我不确定这是否是最好的方法,但它似乎有效。
对于ARC选项,我的印象是项目需要达到10.7或更高才能使用ARC。我希望将10.5作为最低目标
也许我错了。如果是的话,请告诉我。
答案 0 :(得分:0)
如果没有调用finalize
,那么您仍然有一个强引用,或者GC没有运行。由于其他对象最终确定,显然GC正在运行。因此,您将不得不寻找谁拥有强大的参考。审核具有Password
类型变量作为开头的每个人的代码。确保它没有插入某个字典或数组中。确保视图控制器或视图尚未保留它。
如果可能的话,切换到ARC而不是GC。这可能完全一样,但其他一切都要好得多。 GC是一个有趣的实验,我们很多人都忽略了,但ARC肯定是平台的发展方向。
答案 1 :(得分:0)
关于(更新的)问题的这一部分:
对于ARC选项,我的印象是项目需要达到10.7或更高才能使用ARC。我希望将10.5作为最低目标。 也许我错了。如果是的话,请告诉我。
您可以使用ARC定位64位Snow Leopard或更高版本,但如果这样做,则无法使用归零弱引用 - 请使用assign属性,并将任何明确声明的ivars标记为__unsafe_unretained
这条路线。 (this question中的更多信息。)