iOS 5最佳做法(发布/保留?)


109

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


1
使用ARC,并遵循此处概述的最佳实践:amattn.com/2011/12/07/arc_best_practices.html如果这样做,您会发现ARC“有效”。如果你不遵循这些做法,你最终会与泄漏和花费大量的时间跟踪下来....
N13

Answers:


98

由你决定。您可以使用ARC(自动引用计数)编写应用程序,并且Xcode将编写“胶合代码”,以使启用ARC的应用程序可以在iOS 4上运行,而无需进行任何修改。但是,某些事情将无法正常工作,并且最明显的是,您可能希望使用的许多库(有时)会引发无数错误,并且直到开发人员发布与ARC兼容的更新后,您才能使用它们。


编辑:我最近发现,您可以按文件关闭ARC。请参阅pixelfreak的答案。因此,我的建议仍然有效,但是现在不需要更新第3方库来使用ARC。

这是苹果公司对退出ARC选择特定文件的看法:

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

在此处输入图片说明

查看完整的过渡指南这里


15
显然可以基于“每个文件”关闭ARC,也许允许使用旧版库...但是我还没有玩过它,所以我还不知道。我对此很兴奋。您能想象一个世界,iOS开发人员不必费劲保留/发布吗?我们将在这里谈论什么?;-)
Dan Ray

45
当我终于对所有内存管理废话有了一个很好的了解时,然后它们就变得无关紧要了。工作!!!
Kongress

@丹:你不是在开玩笑,它可以有选择地关闭吗?请提供链接,这对我很重要!:D
sudo rm -rf

1
我相信编译器现在不在NDA之下,因此要有选择地从代码中排除某些文件(通常是第三方源文件夹),只需将其作为编译器选项添加到每个文件中: -fno-objc-arc
blackjack75

2
@Yar:是的。我希望它是如此的简单,但是不幸的是,并不是所有的库都那么简单。以JSONKit为例。尝试通过ARC检查运行它。您会明白我的意思的。;)
sudo rm -rf

170

对于仍然对如何关闭单个文件的ARC感到好奇的任何人,这是我的工作:

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

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

PS:我从此处 clang.llvm.org收集了此信息,该信息可公开访问,因此不在NDA之下。


1
当我将该标志与库一起使用时,它可以工作,但是一旦我将lib .h文件包含到ARC类中,Xcode就会发出抱怨,好像我那里没有该标志。您是否能够使较早的库与此标志一起使用?
casey

我能够使ASIHttpRequest和SBJson正常工作(我在Reachability.h中收到有关结构用法的1条警告)。我将标记放在所有实现文件中。
pixelfreak 2011年

所有实施文件还是.h文件?在项目的“我的编译源”部分中,它只有头文件,没有实现文件。我可以添加它们,但是似乎没有什么不同的效果。供您参考,我正在尝试使REST解析器正常工作。(github.com/mirek/NSMutableDictionary-REST.framework
凯西

1
啊哈!我对这些错误的关注不够。与没有标志相比,它们是不同的错误。我只需要从代码和wha-la中删除自动发布池即可!
casey

当我选择多个文件并按Enter键时(如此处建议的那样),它们在Build阶段均已从“编译源”中删除。我必须单独选择它们。不知道我做错了什么。
Gopalakrishnan Subramanian 2012年

10

iOS 5仍处于NDA之下,并且可能要等到它们发布公共版本之后。如果您有开发者帐户,请前往Apple开发者论坛并在此处提问。

对于以前的版本,您必须计算引用数并相应地保留和发布。查阅《内存管理》指南

编辑:这是自动引用计数公共规范,并来自公共iOS 5页面的报价:

用于Objective-C的自动引用计数(ARC)使内存管理成为编译器的工作。通过使用新的Apple LLVM编译器启用ARC,您将不再需要再次键入“保留”或“释放”,从而大大简化了开发过程,同时减少了崩溃和内存泄漏。编译器完全了解您的对象,并在不再使用每个对象时将其释放,因此应用程序可像以往一样快速运行,并具有可预测的平滑性能。


使用iOS 5开发的应用程序是否可以与旧版iPhone一起使用?
Geekgirl 2011年

您将能够使用该工具为较旧的操作系统进行开发,但将无法使用ARC等新技术。如果要针对较旧的操作系统,则必须进行手动内存管理。如果你想使用ARC你必须限制用户的iOS 5
妮娃王

1
对ARC的参考是在面向公众的Apple页面developer.apple.com/technologies/ios5上,因此至少有一部分不在NDA之下。
cobbal 2011年

8
其实那不是真的。您可以使用ARC为iOS 4进行构建。Apple工程师的话:“ 对于iOS 4和Mac OS 10.6,编译器向您的应用程序添加了一些运行时兼容性粘合代码。此方法适用于__weak变量以外的所有内容,__ weak变量需要比兼容性代码所提供的支持更多的支持。 4比非ARC代码更简单,但是却不如iOS 5上的ARC简单。 “顺便说一下,WWDC计划应用程序是使用ARC编写的,并且可以在iOS 4上正常工作!
sudo rm -rf

3
是的 但是,在ARC讨论中这是合格的,因为只有4.3.x目标获得了“兼容性胶水”。
Alan Zeino 2011年

4

目前,详细信息还在NDA之下,但Apple已在iOS 5中实现了自动引用计数(ARC),如下所示:http//developer.apple.com/technologies/ios5/

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

[编辑] sudo rm -rf很好;第三方库可能会受到严重影响


使用iOS 5开发的应用程序是否可以与旧版iPhone一起使用?
Geekgirl 2011年

它可以在运行iOS 5的iPhone上运行,因此只能在iPhone 3GS或iPhone 4上运行。我不相信它将支持iOS 4,但是同样,它是在编译时由LLVM完成的,因此可能会为iOS 4和5。我强烈建议您拥有一个iOS开发者帐户并尝试使用可用选项。
多米尼克

正如sudo在对nevan的回答的评论中所指出的那样,您的确可以使用ARC锁定iOS 4.0,因此可以运行该OS的旧设备与此兼容。
布拉德·拉尔森

3

没有人提到SystemConfiguration.framework吗?请不要忘记将其放入Frameworks中。我痛苦地花了几个小时才意识到。


你应该解释为什么。
John Riselvato

3

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.