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

Posted

技术标签:

【中文标题】iOS 4 真的支持 ARC 吗? iOS 4.2 SDK 在链接时缺少与 ARC 相关的符号【英文标题】:Is ARC really supported in iOS 4? The iOS 4.2 SDK is missing ARC-related symbols at linking time 【发布时间】:2011-12-06 13:28:21 【问题描述】:

自从 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 SDK。使用 5.0 SDK。设置您的部署目标。我不是这个意思,我的意思是总体上;不应使用较旧的 SDK。 哇,我不敢相信我已经走了这么久,却不知道更新的 SDK 可以为旧的操作系统版本构建。在这里,我对 Apple 很生气,他们一直在删除我所有的旧 SDK 版本:/ 谢谢! 【参考方案1】:

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

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

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

请注意,NSDictionary 和 NSArray 下标部署回 OS X 10.6 和 iOS 4,请务必将部署目标也设置回。

【讨论】:

谢谢(掌声)。它实际上似乎也在使用 4.2 作为部署目标,但是......现在要在真实设备上进行测试。 它似乎在我的设备上运行良好,运行 iOS 4.2.1。 抱歉,看起来@CocoaFu 是正确的。我重新启动 Xcode 后,它似乎只在 4.3 中工作。 Xcode 4 似乎很容易混淆:( Apple 自己说 ARC 在“iOS 4”上可用:developer.apple.com/library/ios/#releasenotes/ObjectiveC/… 就我个人而言,我已经在 iOS 4.2 的 iPhone 3G 和 iOS 4.2 的 iPad 上运行了 ARC 应用程序。但是,如果您使用“weak”关键字,则尝试为 iOS 4.x 构建时会出错。 我可以确认没有弱引用支持的 ARC 至少可以在 iOS 4.2.1 上运行,我没有任何旧版本可以测试。【参考方案2】:

有点晚了,但这是重要的信息。接受的答案是正确的,Apple states iOS 4.0 and above 作为 ARC 支持的最低操作系统。

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

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

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

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

【讨论】:

你提到的第二部分又回来困扰我,在+load 崩溃。我们将很快放弃 iOS 4.3,但我必须为一些拒绝将 4.3 更新到 5 或 6 的人提供另一个工作更新,gaaaah。

以上是关于iOS 4 真的支持 ARC 吗? iOS 4.2 SDK 在链接时缺少与 ARC 相关的符号的主要内容,如果未能解决你的问题,请参考以下文章

转:在支持ARC工程中编译不支持ARC的文件

允许 AirPlay 支持和 iOS 4.2、iOS 4.3

iPhone 6 支持 BLE 4.2,但没有示例

为啥 Xcode 4.2 不支持运行 iOS 4.2.1 的第二代 iPod Touch

Xcode 4.2 + iOS6 = Interface Builder 错误

IOS开发 arc与非Arc代码的区别