ARC真的支持iOS 4吗? iOS 4.2 SDK在链接时缺less与ARC相关的符号
自从ARC第一次宣布这是一个编译时的事情,我已经阅读和听到,将与iOS 4向后兼容。我已经成功地使用Xcode 4.2的自动重构将我的项目重构为ARC,并且在针对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