从Objective-C开始:使用ARC还是不使用ARC?

9
根据Apple的ARC文档,使用ARC开发软件时有相当数量的变化。作为完全的Objective-C初学者,禁用ARC是否更好一些,因为这能让我更好地了解底层发生的事情?或者ARC已经淘汰了“旧方法”,以至于学习它不值得花时间?

感谢所有的回复,它们都非常有帮助! - Marty
早在这个问题首次被提出时,对于做出决定而犹豫不决是有充分的理由的。但现在ARC已经成为事实,并且几乎所有最近的代码示例都会默认使用ARC。只需大声喊出“我爱老大哥”,并随波逐流即可。 - Hot Licks
5个回答

11

这基本上是一个意见问题,因此相当危险。

我的观点是可以学习基本的内存管理。资格在于不要被困在其中。通过一些非常简单的项目了解自动引用计数(ARC)正在为您做什么。一旦您基本了解如何处理内存管理,即如何避免保留环路(正如jemmons所暗示的,它们仍然可能是ARC的问题)。一旦您对内存管理有了基本的掌握,就可以开始使用ARC。

此外,正如Jason Coco所指出的那样,ARC会处理(简单地说)NSObject子类的内存管理。因此,如果您需要使用它们,则仍将自己处理所有CF对象。

有关ARC在幕后为您做了什么的优秀解释可以在 WWDC2011 Session 323 - Introducing Automatic Reference Counting 中找到。

但是还有一些其他考虑因素可能影响您的决定。

你需要目标设备吗?

如果您计划针对iOS 4.3及更高版本,则ARC可以有效地为您处理内存管理。(NSObject子类)

如果您计划针对iOS 4.2,则无法使用弱引用(您将使用unsafe_unretained)。因为仍有许多这些设备在使用中,如iPhone 3g和iPod touch 2nd gen,在该操作系统级别上受阻,因此许多开发人员仍在针对它们。

如果您计划针对早于4.2的(这将很少见),则绝对需要学习MRC(手动引用计数)。

如果您计划构建Mac应用程序,则该平台提供垃圾回收器。ARC也是一个选项(完全支持ARC 10.7,无弱支持10.6)。


7
值得注意的是,当您在Xcode中启动新项目时,默认情况下会检查ARC。这与任何其他迹象一样表明,旧的retain/release做事情的方式已经过时,并且苹果认为ARC是未来。作为新的ObjC开发人员的第一课,您可能从中学到,与苹果游泳不利于您。

此外,虽然将旧的retain/release示例转换为ARC相当容易(大多数情况下,只需删除任何retainreleaseautorelease),但反之则不然。我已经看到了很多用ARC风格编写的示例代码。因此,作为刚开始学习的人,学习ARC方式更有价值。

请注意,这并不意味着您不需要理解引用计数。它仍然是对象生命周期的重要组成部分,您仍然需要了解这些内容(即使只是知道何时使用weakstrong引用)。但当编写代码时,请使用ARC。


4

“旧”风格就是使用引用计数来管理对象的生命周期。实际上并没有太多需要注意的,但是它容易出错,会带来各种问题。如果你刚开始学习编程,我个人建议你直接学习使用ARC。当你需要使用C库对象(例如CoreFoundation或CoreGraphics)时,你仍然需要处理引用计数。


4

0

仅仅是了解一下它的运作原理是个好主意,但对于开发来说并不是必要的。正如你所看到的,大多数开发者已经将他们的部署目标移至 iOS 5.0+,因此你可能不会在手动引用计数下进行开发。

然而,如果你计划在代码中使用非 ROP -retainable object pointers-,比如 CFStringRef,那么你可能需要真正地了解非 ARC,这样你就可以理解桥接等内容,因为你可以在一个项目中结合使用 ARC 和非 ARC 代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接