iOS 5 最佳实践(发布/保留?)

Posted

技术标签:

【中文标题】iOS 5 最佳实践(发布/保留?)【英文标题】:iOS 5 Best Practice (Release/retain?) 【发布时间】:2011-06-10 15:19:16 【问题描述】:

作为一个初学 iPhone 程序员,编写适用于 ios 5 或更早版本的应用程序的最佳实践是什么?具体来说,我应该继续使用数据的发布/保留,还是应该忽略它?有关系吗?

【问题讨论】:

使用 ARC,并遵循此处概述的最佳实践:amattn.com/2011/12/07/arc_best_practices.html 如果您这样做,您会发现 ARC“有效”。如果您不遵循这些做法,您最终会遇到泄漏并花费大量时间来追踪它们.... 【参考方案1】:

对于那些仍然对如何在单个文件上关闭 ARC 感到好奇的人,这是我所做的:

    转到Build Phases > Compile Sources 下的项目设置 选择要禁用 ARC 的文件并添加 -fno-objc-arc 编译器标志。您可以通过选择文件然后按“Enter”键一次为多个文件设置标志。

我不知道这是否是推荐的方式,但它对我有用。

PS:我从 clang.llvm.org here 收集了这些信息,该信息可公开访问,因此不受 NDA 约束。

【讨论】:

当我将此标志与库一起使用时,它可以工作,但是一旦我将 lib .h 文件包含到 ARC 类中,Xcode 就会抱怨,好像我在那里没有标志一样。您能否让较旧的库使用此标志? 我能够让 ASIHttpRequest 和 SBJson 正常工作(我在 Reachability.h 中收到 1 条关于结构使用的警告)。我把标志放在他们所有的实现文件中。 所有实现文件还是.h文件?在我的项目的编译源部分中,它只有头文件,没有实现文件。我可以添加它们,但它似乎没有不同的效果。供您参考,我正在尝试让 REST 解析器工作。 (github.com/mirek/NSMutableDictionary-REST.framework) 啊哈!我没有仔细观察错误。它们与没有标志的错误不同。我只需要从代码中删除自动释放池就可以了! 当我选择多个文件并按 Enter 键时,正如这里所建议的那样,它们都已从构建阶段的“编译源”中删除。我不得不单独选择它们。不确定我是否做错了什么。【参考方案2】:

这取决于你。您可以使用 ARC(自动引用计数)编写应用程序,Xcode 将编写“粘合代码”以允许您启用 ARC 的应用程序在 iOS 4 上运行,无需修改。但是,某些事情不会起作用,最明显的是,您可能希望使用的许多库(有时)会抛出无数错误,并且在开发人员发布与 ARC 兼容的更新之前,您将无法使用它们。


编辑:我最近发现您可以按文件关闭 ARC。见pixelfreak's answer。所以,我的建议仍然有效,但现在不需要更新第 3 方库即可与 ARC 一起使用。

以下是 Apple 关于为特定文件选择退出 ARC 的说明:

当您迁移项目以使用 ARC 时,-fobjc-arc 编译器标志为 设置为所有 Objective-C 源文件的默认值。您可以禁用 使用 -fno-objc-arc 编译器标志的特定类的 ARC 那堂课。在 Xcode 中,在目标 Build Phases 选项卡中,打开 Compile Sources 组显示源文件列表。双击文件 要为其设置标志,在弹出窗口中输入 -fno-objc-arc 面板,然后单击完成。

请参阅完整的过渡指南here。

【讨论】:

ARC 显然可以在“每个文件”的基础上关闭,也许允许使用遗留库......但我还没有玩过它,所以我还不知道。不过我对此很兴奋。你能想象一个 iOS 开发人员不必费力保留/发布的世界吗?我们将在这里谈论什么? ;-) 就在我终于掌握了所有内存管理废话的时候,他们却让它变得无关紧要。工作!!! @Dan:你不是在开玩笑吗?它可以选择性地关闭吗?请给一个链接,这对我很重要! :D 我相信编译器现在不在 NDA 之下,因此要从您的代码中选择性地排除一些文件(通常是第三方源文件夹),只需将其作为编译器选项添加到每个文件:-fno-objc-arc跨度> @Yar:是的。我希望它是那么简单,但不幸的是,并非所有库都那么简单。以JSONKit 为例。尝试通过 ARC 检查运行它。你会明白我的意思。 ;)【参考方案3】:

iOS 5 仍处于保密协议下,并且可能会在他们发布公共版本之前。如果您有开发者帐户,请前往 Apple Developer Forums 并在那里询问。

对于以前的版本,您必须计算引用并相应地保留和释放。查看Memory Management guide。

编辑:这是public spec for Automatic Reference Counting 和public iOS 5 page 的引用:

Objective-C 的自动引用计数 (ARC) 使内存管理成为编译器的工作。通过使用新的 Apple LLVM 编译器启用 ARC,您将无需再次键入 retain 或 release,从而大大简化了开发过程,同时减少了崩溃和内存泄漏。编译器全面了解您的对象,并在每个对象不再使用时立即释放它,因此应用运行速度与以往一样快,性能可预测且流畅。

【讨论】:

使用 iOS 5 开发的应用程序可以在旧款 iPhone 上使用吗? 您将能够使用这些工具为较旧的操作系统进行开发,但您将无法使用像 ARC 这样的新技术。如果要针对较旧的操作系统,则必须进行手动内存管理。如果您想使用 ARC,您必须将用户限制为 iOS 5。 对 ARC 的引用在面向公众的 Apple 页面 developer.apple.com/technologies/ios5 上,因此至少它的某些部分不在 NDA 之下。 其实这并不完全正确。您可以使用 ARC 为 iOS 4 构建。引用 Apple 工程师的话:“对于 iOS 4 和 Mac OS 10.6,编译器会在您的应用程序中添加一些运行时兼容性胶水代码。这适用于除 __weak 变量之外的所有内容,它需要比兼容性代码提供的更多支持。 iOS 4 上的 ARC 比非 ARC 代码简单,但不如 iOS 5 上的 ARC 简单。”顺便说一句,WWDC 日程应用程序是用 ARC 编写的,它在 iOS 4 上运行良好! 是的;然而,这在 ARC 演讲中是合格的,因为只有 4.3.x 目标获得了“兼容性粘合剂”。【参考方案4】:

目前细节尚不清楚/在 NDA 下,但 Apple 已在 iOS 5 中实施自动引用计数 (ARC),详情如下:http://developer.apple.com/technologies/ios5/

如果您在 Xcode 4 中使用 iOS 5 SDK 开发新应用,您可以放心地忽略保留/释放计数。

[edit] sudo rm -rf 提出了一个很好的观点;第三方库可能会受到重大影响

【讨论】:

使用 iOS 5 开发的应用程序能否与旧款 iPhone 兼容? 它适用于运行 iOS 5 的 iPhone,所以只有 iPhone 3GS 或 iPhone 4。我不相信它会支持 iOS 4,但话又说回来,它是由 LLVM 在编译时完成的,所以它可能可以为 iOS 4 和 5 生成二进制文件。我强烈建议您获得一个 iOS 开发者帐户并使用可用选项。 正如 sudo 在他对 nevan 回答的评论中指出的那样,您确实可以使用 ARC 回到 iOS 4.0,因此可以运行该操作系统的旧设备与此兼容。【参考方案5】:

没有人提到SystemConfiguration.framework? 请不要忘记将其放入Frameworks。 我悲惨地花了几个小时才意识到这一点。

【讨论】:

你应该解释原因。【参考方案6】:

这当然是开发者或团队的选择。 ARC(自动引用计数器)通过为您自动管理内存使事情变得更容易。它将在适当的时候释放、保留和解除分配。我确实相信,如果您还没有,最好在测试应用程序中获得自己管理内存的经验。要考虑的另一件事是您的应用程序是否依赖第三方库,如果不转换为 ARC 将阻止您的应用程序编译。选择显然取决于手头的情况。

【讨论】:

【参考方案7】:

在项目设置>构建阶段>编译源中将标志设置为-fno-objc-arc

【讨论】:

以上是关于iOS 5 最佳实践(发布/保留?)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 迁移 - 永远保留它们?啥是最佳实践?

说出 5 条 IO 的最佳实践?

iOS 屏幕绘图最佳实践

保留旧版本的 Git 最佳实践

在 .NET 应用程序中保留配置/用户信息的最佳实践 [重复]

最佳实践。通过支持 iOS 5、iOS 6 和 iOS 7 UI 使 iOS 应用程序通用