有关iOS5 SDK中自动引用计数的一些问题
我目前正在为iPad开发一个应用程序。 iOS 4.2的开发工作已经开始,现在iOS 4.3仍在继续(我认为将会完成)。 我刚刚在iOS 5中阅读了关于ARC的内容,基本上我明白我们将永远不需要释放和保留对象了。 我的问题是:
-
如果我决定升级到iOS 5,是否需要从我的代码中删除所有
[myObject retain]
和[myObject release]
语句? -
如果我使用ARC开发iOS 5的新应用程序,我是否需要实施某种“复古兼容性”检查? 即:我是否需要检查iOS的版本,并相应地调用retain和release? 那么,基本上,ARC是可用于所有iOS版本还是仅适用于iOS 5?
如果我决定升级到iOS 5,是否需要从我的代码中删除所有[myObject retain]和[myObject release]语句?
是的,但是XCode 4.2包含了一个新的“移植到Objective-C ARC”工具(在Edit-> Refactor菜单中),它可以帮助你。 调用dealloc是一个不同的故事。 正如评论中提到的那样,clang引用指出你应该保留你的dealloc方法:
理由:即使ARC自动销毁实例variables,仍然有合法的理由来编写一个dealloc方法,例如释放不可保留的资源。 没有在这样的方法中调用[super dealloc]几乎总是一个错误。
您可以使用新的-fobjc-arc编译器标志来启用ARC。 对于Mac OS X v10.6和v10.7(64位应用程序)以及iOS 4和iOS 5,Xcode 4.2支持ARC(Mac OS X v10.6和iOS 4不支持弱引用)。 Xcode 4.1没有ARC支持。
–
如果我使用ARC开发iOS 5的新应用程序,我是否需要实施某种“复古兼容性”检查? 即:我需要检查iOS的版本,并相应地调用retain和release吗? 那么,基本上,ARC是可用于所有iOS版本还是仅适用于iOS 5?
不,因为ARC在编译时,而不是在运行时发挥作用。
ARC没有记住何时使用retain,release和autorelease,而是评估对象的生命周期需求,并在编译时自动插入适当的方法调用。 编译器也为你生成适当的dealloc方法。
有关ARC的更多信息: http : //clang.llvm.org/docs/AutomaticReferenceCounting.html
Q1:不,如果你有一个已经存在的代码,你可以像使用-fno-objc-arc一样继续使用它,你可以在任何文件上select性地禁用ARC。
如果你想在MULTIPLE文件上禁用ARC :
- 在Xcode中的Target / Build Phases / Compile Sources中select所需的文件
- 按回车 。 (双击只select一个文件)
- 键入-fno-objc-arc
- 按input或完成
Q2:不,目标可以低至iOS 4.0
据我所知,只要我的iPhone / iPod运行iOS 5和iOS 4.3分别工作,它都是相当自动的。 我从4.0开始的一个应用程序,并且已经“更新”以与iOS 5.0的Xcode一起工作,从来没有抛出任何关于释放和保留的警告,尽pipe它遍布每一个dealloc等等。然而,我插入了一些相同的代码(复制文件)到用iOS 5 创build的新项目有许多警告。 所以看起来你不必删除所有这些电话,不,它会自动适应旧版本。 分析我的iPod,我没有看到内存泄漏或其他deallocs /释放失败的迹象。 这有帮助吗?
关于你的问题的这一部分
如果我使用ARC开发iOS 5的新应用程序,我是否需要实施某种“复古兼容性”检查? 即:我需要检查iOS的版本,并相应地调用retain和release吗? 那么,基本上,ARC是可用于所有iOS版本还是仅适用于iOS 5?
应该指出的是,iOS 5编译器采用了“复古兼容性”(实际上它使代码保持/释放工作本质上),但是如果你没有为iOS 5.0编译,你不能使用weak
关键词。 而是使用assign
。 这是不幸的: weak
是一个巨大的优势(没有悬挂指针,永远!)。 看到我的问题在这里讨论weak
, assign
和弧。
如果您可以通过不使用新的-fobjc-arc编译器标志来禁用ARC,那么您不必强制重写前进的代码 – 我猜(?)