在iOS 4中是否真的支持ARC?iOS 4.2 SDK在链接时缺少与ARC相关的符号

Dou*_*ide 32 iphone ios4 ios xcode4.2 automatic-ref-counting

自从ARC首次宣布它是一个编译时的东西并且将向后兼容iOS 4以来,我已经阅读和听过.我已经使用Xcode 4.2的自动重构成功地将我的项目重构为AR​​C,并且在编译时iOS 5.0 SDK,它运行正常.但是,如果我尝试针对我的iOS 4.2 SDK进行编译,则会在链接时失败,缺少以下符号:

  • _objc_retainAutoreleaseReturnValue
  • _objc_autoreleaseReturnValue
  • _objc_storeStrong
  • _objc_retain
  • _objc_release
  • _objc_retainAutoreleasedReturnValue

我查了一下,这些符号出现在5.0但不是4.2中:

iPhoneOS5.0.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$
00005ed0 T _objc_retain
000061d0 T _objc_retain

iPhoneOS4.2.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$
[... *crickets* ...]
Run Code Online (Sandbox Code Playgroud)

这是否意味着苹果撒谎?相反,我认为我很困惑,做错了什么,但我无法弄清楚是什么.

这是Xcode 4.2(Build 4C199)的GM版本

zap*_*aph 34

iOS 4.3及更高版本支持ARC.您需要使用iOS 5.x SDK,但可以为部署目标选择iOS 4.3.4.x中不支持的一件事是自动弱参考归零.

有关Objective-C功能可用性索引,请参阅此处的 Apple文档.

Xcode 4.4和4.5可用于提交应用程序.

请注意,NSDictionary和NSArray下标部署回OS X 10.6和iOS 4,请务必同时设置部署目标.


Pau*_*nge 11

有点晚了,但这是重要的信息.接受的答案是正确的,Apple声称iOS 4.0及更高版本是ARC支持的最低操作系统.

但是,它可以在一些情况下破裂.其中一个当然是__weak关键字及其衍生物.您将看到如下错误.

dyld: lazy symbol binding failed: Symbol not found: _objc_initWeak
Run Code Online (Sandbox Code Playgroud)

第二个非常危险的情况是你使用+loadNSObject 的方法.如果在iOS 4.x上使用ARC执行此操作,则会发现很难找到的运行时崩溃.如果您遇到如下所示的运行时错误,请检查您的+load方法.对我来说,它为该特定文件设置了-fno-objc-arc标志.

dyld: lazy symbol binding failed: Symbol not found: _objc_retainAutoreleasedReturnValue
Run Code Online (Sandbox Code Playgroud)