32

自从 ARC 首次宣布它是一个编译时的东西并且将与 iOS 4 向后兼容以来,我已经阅读和听说过。我已经使用 Xcode 4.2 的自动重构成功地将我的项目重构为 ARC,并且在针对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* ...]

这是否意味着苹果在撒谎?相反,我假设我很困惑并且做错了什么,但我不知道是什么。

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

4

2 回答 2

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,请务必同时设置部署目标。

于 2011-10-12T23:34:32.557 回答
11

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

但是,它可能会在某些情况下中断。其中之一当然是__weak关键字及其派生词。您将看到如下所示的错误。

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

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

dyld: lazy symbol binding failed: Symbol not found: _objc_retainAutoreleasedReturnValue
于 2012-08-28T07:50:18.623 回答