为 iPhone 4 SDK 构建的 Blocks 在部署到 iPhone OS 3.0 时可以工作吗?

Posted

技术标签:

【中文标题】为 iPhone 4 SDK 构建的 Blocks 在部署到 iPhone OS 3.0 时可以工作吗?【英文标题】:Can Blocks built for the iPhone 4 SDK work when deployed to iPhone OS 3.0? 【发布时间】:2010-07-07 16:21:55 【问题描述】:

如果您将应用程序设置为部署到早期版本,则最新的 Xcode IDE 要求您以 iPhone SDK 4 为目标,同时动态处理已弃用的功能和新功能。

那么,我能否在使用 Blocks 等新功能的同时让它在运行 iPhone OS 3.0 或 3.1 或 3.1.3 的设备上运行?

我还没有找到有关如何向后兼容以前的 iPhone 操作系统版本的文档。如果你能指出我应该如何做的官方文档,我会很感激。

【问题讨论】:

【参考方案1】:

据我所知,块在 3.2 之前无法工作,因为不包括块运行时(__NSStackBlock__ 等类)。除此之外,我的理解是,如果您使用足够新的编译器,您可以使用块编译代码。一种解决方案是在您的项目中有条件地包含自定义块运行时。

【讨论】:

【参考方案2】:

虽然最简单的做法是尝试它,但我认为如果它们存在但不使用它们不会造成伤害(例如,您使用运行时 if 语句来规避使用预先代码的块4.0 设备),但它们肯定不会在 4.0 之前的设备上运行,而且 Apple 提供的所有使用块的 API 无论如何都将不可用。总而言之,如果你有办法在没有块的情况下做某事,那么没有理由用不同的方法来做块——这只会增加冗余和重复代码——因此,如果你希望针对 4.0 之前的设备,你不应该使用块,但如果你想/需要使用块,不要针对低于 4.0 的操作系统

【讨论】:

【参考方案3】:

使用预处理器指令 (http://developer.apple.com/iphone/library/documentation/xcode/conceptual/iphone_development/115-Configuring_Applications/configuring_applications.html),例如 TARGET_OS_IPHONE 来为不同的 ios 版本使用代码。

【讨论】:

这并没有真正回答主要问题,尽管这很有用。 你问如何有条件地为旧版本的 iOS 编写代码,你就是这样做的。我错过了什么? 阅读问题的第一段。【参考方案4】:

不,如果没有PLBlocks,块将无法在 iPhone 3.2 之前的版本上运行 — 即使这样,任何获取块的方法都可能不存在。

【讨论】:

以上是关于为 iPhone 4 SDK 构建的 Blocks 在部署到 iPhone OS 3.0 时可以工作吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XCode 4 + 基本 SDK 4.3 为 iOS 4.0 设备构建?

如何提交在iPhone OS 3和iPhone SDK 4上运行的应用程序版本?

您可以使用 iOS6 SDK 构建但在 iPhone 5 上保持信箱吗?

iPhone SDK 代码签名错误

将我的应用程序构建到我的 ipod touch 时出错:将“目标设备系列”设置为仅 iPhone(“1”)不支持 SDK“设备 - iPhone OS 3.2”

使用 SDK 4.2 开发的 iPhone 应用程序需要向后兼容 iOS 3.1.3 .. 简单的方法?