ARC真的支持iOS 4吗? iOS 4.2 SDK在链接时缺less与ARC相关的符号

自从ARC第一次宣布这是一个编译时的事情,我已经阅读和听到,将与iOS 4向后兼容。我已经成功地使用Xcode 4.2的自动重构将我的项目重构为AR​​C,并且在针对iOS 5.0 SDK,它工作正常。 但是,如果我尝试编译我的iOS 4.2 SDK,它在链接时失败,缺less以下符号:

  • _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* ...] 

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

这是通用汽车发布的Xcode 4.2(Build 4C199)

ARC在iOS 4.3及以上版本中受支持。 您需要使用iOS 5.x SDK,但可以selectiOS 4.3作为部署目标。 4.x中不支持的一件事是自动弱参考调零。

Objective-C特性可用性索引请参阅Apple的文档。

Xcode 4.4和4.5可以用来提交应用程序。

请注意,NSDictionary和NSArray的脚本部署回到OS X 10.6和iOS 4,一定要设置部署目标。

有点晚,但这是重要的信息。 接受的答案是正确的, 苹果表示iOS 4.0及以上版本是ARC支持的最低操作系统。

但是,在一些情况下可以打破。 其中之一当然是__weak关键字,它是衍生物。 你会看到如下的错误。

 dyld: lazy symbol binding failed: Symbol not found: _objc_initWeak 

第二个非常危险的条件是当你使用NSObject的+load方法。 如果你在iOS 4.x上使用ARC,你将会遇到很难find的运行时崩溃。 如果你得到如下的运行时错误,请检查你的+load方法。 对我来说,它的工作是为该特定文件设置-fno-objc-arc标志。

 dyld: lazy symbol binding failed: Symbol not found: _objc_retainAutoreleasedReturnValue