我目前正在为iPad开发应用程序。 iOS 4.2开始开发,现在继续(我认为将完成)iOS 4.3。 我刚刚阅读了iOS 5中的ARC,基本上我明白我们将永远不再需要发布和保留对象。我的问题是:
如果我决定升级到iOS 5,是否需要从代码中删除所有[myObject retain]
和[myObject release]
语句?
如果我使用ARC开发适用于iOS 5的新应用,我是否需要实施某种“复古兼容性”检查?即:我需要检查iOS版本并相应地调用retain和release吗?那么,基本上,ARC适用于所有iOS版本还是适用于iOS 5?
答案 0 :(得分:150)
如果我决定升级到iOS 5,请执行此操作 需要删除所有[myObject retain] 来自的[myObject release]语句 我的代码?
是的,但是XCode 4.2包含一个新的“迁移到Objective-C ARC”工具(在Edit-> Refactor菜单中),它可以为您完成。调用dealloc是一个不同的故事。正如评论中所提到的,clang引用声明你应该保留dealloc方法:
基本原理:即使ARC自动销毁实例变量,仍然有合理的理由来编写dealloc方法,例如释放不可保留的资源。在这种方法中未能调用[super dealloc]几乎总是一个错误。
使用新的-fobjc-arc启用ARC 编译器标志。支持ARC 适用于Mac OS X v10.6和v10.7的Xcode 4.2 (64位应用程序)和iOS 4 和iOS 5.(弱引用不是 在Mac OS X v10.6和iOS中受支持 4)。 Xcode中没有ARC支持 4.1。
-
如果我使用iOS 5开发新的应用程序 ARC,我需要实现一些 那种“复古兼容性”检查? 即:我需要检查版本 iOS和调用保留和释放 因此?所以,基本上就是ARC 适用于所有iOS版本或仅适用于 对于iOS 5?
不,因为ARC在编译时而不是在运行时发挥其魔力。
而不是你必须记住什么时候 使用保留,释放和 自动释放,ARC评估 对象的生命周期要求 并自动插入 适当的方法要求你 编译时间。编译器也 生成适当的dealloc方法 对你而言。
有关ARC的更多信息:http://clang.llvm.org/docs/AutomaticReferenceCounting.html
答案 1 :(得分:8)
Q1:不,如果您有现有代码,可以继续使用 -fno-objc-arc ,您可以选择性地禁用任何文件上的ARC。
如果您想在 MULTIPLE 文件停用ARC :
Q2:不,目标可以和iOS 4.0一样低
答案 2 :(得分:7)
据我所知,就运行iOS 5和iOS 4.3的iPhone / iPod而言,它们都非常自动化。我开始使用4.0并且已经“更新”以使用Xcode for iOS 5.0的应用程序永远不会抛出任何关于释放和保留的警告,即使它遍及每个dealloc等等。但是,我插入了一些相同的代码(复制文件)到一个新项目创建与Xcode for iOS 5有很多很多警告。所以看起来你不必删除所有这些调用,不,它以某种方式自动适应旧版本。分析我的iPod,我看到没有内存泄漏或其他deallocs / release失败的迹象。这有帮助吗?
答案 3 :(得分:5)
关于你问题的这一部分
如果我使用ARC开发适用于iOS 5的新应用,我是否需要实施 某种“复古兼容性”检查?即:我需要检查一下 iOS版本并相应调用retain和release?所以, 基本上,ARC适用于所有iOS版本还是适用于iOS 5?
应该注意的是,iOS 5编译器采用了“复古兼容性”(它实际上是ADDS代码,使得保留/释放工作,本质上),但如果你没有编译iOS 5.0,你就无法使用weak
作为关键字。而是使用assign
。这很不幸:weak
是一个巨大的优势(没有悬空指针,永远!)。有关weak
,assign
和ARC的讨论,请参阅我的问题here。
答案 4 :(得分:2)
如果你可以通过不使用新的-fobjc-arc编译器标志来禁用ARC,那么你就不会被迫重新编写代码 - 我想(?)