通过Xcode 4.2中引入的新自动引用计数(ARC),我们不再需要在Objective-C中手动管理保留/释放.
这看起来类似于垃圾收集,就像Mac上的Objective-C和其他语言一样.ARC如何与垃圾收集不同?
当我从C++(和小Java)转移到Objective C(iOS)时,我很难理解iOS中的内存管理.但现在这一切看起来很自然,我知道保留,自动释放,复制和发布的东西.在阅读了ARC之后,我想知道使用ARC有什么好处,或者只是你不必担心内存管理.在转向ARC之前,我想知道如何转向ARC.
我无法在现实生活中找到关于ARC性能影响的客观研究. 官方文件说
编译器有效地消除了许多无关的保留/释放调用,并且已经投入了大量精力来加速Objective-C运行时.特别是,当方法的调用者是ARC代码时,常见的"返回保留/自动释放对象"模式要快得多,并且实际上并不将对象放入自动释放池中.
由技术爱好者传播/变形为"ARC更快".
我所知道的就是我所测量的.我们最近将我们的iOS项目迁移到了ARC,我在代码的一些CPU密集区域之前/之后进行了一些性能测量(生产代码,-Os当然是用标志编译的).
我观察到70%(是70%)的性能回归.使用Instruments跟踪保留/释放事件,我意识到编译器在你不会这样做的区域引入了很多保留/释放对(在ARC之前的环境中).基本上,任何临时变得强大.也就是说,我相信,性能回归的来源.
迁移之前的原始代码已经非常优化.几乎没有任何自动释放.因此,切换到ARC几乎没有改进的余地.
幸运的是,Instruments能够向我展示ARC引入的最昂贵的保留/释放,并且我能够使用__unsafe_unretained来停用它们.这略微减轻了性能回归.
是否有人有关于此技术或其他技术的任何信息以避免性能损失?(除了停用ARC)
谢谢.
编辑:我不是说ARC因为性能影响而坏.使用ARC的优势在很大程度上优于性能回归(在我们的代码中,回归没有任何明显的效果,所以我放手了).我认为ARC是一项非常好的技术.我永远不会回到MRC.我好奇地问这个问题.
我只是对这个主题的绝大多数博客(比如这里 和那里)略微恼火,或多或少给人的印象是ARC代码会比MRC代码更快(我之前我相信的事情是我把它放在它上面).而且我确实感觉在某些微观基准测试之外并非如此.充其量你可以希望与MRC相提并论,而不是更快.我做了一些其他涉及对象操作的简单测试(比如计算文档中的单词).每次ARC都比较慢(认为不像我最初谈论的70%的回归那样糟糕)
\ {开始嘲讽}
事实上,上述文档确实回答了这个问题:
ARC慢吗?
这取决于你测量的是什么,但通常是"不".
显然应该理解为
\ {开始模仿}
嗯......哼......我们不能说它慢一点,因为这是一个新的酷技术,我们希望你采用它.所以我们用双引号回答"否"只是为了避免集体诉讼.并停止问愚蠢的问题.
\ {端模仿}
\ {端讽刺}
是否有可能(如果是这样,安全)创建/使用以双指针作为参数的块?
例如:
- (void)methodWithBlock:(void (^)(NSError **error))block;
其他背景,研究和问题:
[self methodWithBlock:^(NSError *__autoreleasing *error) {}];
什么__autoreleasing,为什么要添加它?我认为它与ARC有关.- (void)methodWithDoublePointer:(NSError **)error;)传递之间有什么重要区别?应该考虑哪些特殊考虑因素(再次假设这是可能的)?我不喜欢ARC.
但ARC的最重要特征是归零弱参考,在非ARC下缺失.目前我正在使用MAZeroingWeakRef,它可以工作,但hacky,有时会使代码多余.将弱引用归零的任何其他方法?
我们正在开发一个我们想要在iOS 4.3及更高版本上运行的应用程序.
我们的高级开发人员认为使用ARC是一件坏事,并且会导致iOS 5以下的任何事情发生崩溃和问题.这是真的吗?在iOS 4.3上使用ARC时会出现什么问题?
我知道你必须使用unsafe_unretained而不是弱引用.这可能导致什么问题?
如果我们也在为iOS 4.3开发,我们是否应该根本不使用ARC?或者是否可以使用ARC为iOS 5及以上版本和iOS 4.3开发可靠的应用程序?
我目前正在学习Objective C,到目前为止我一直在使用自动引用计数和我的所有项目.然而,在与一些同事交谈之后,在网上查看了一些论坛后,我注意到了一种趋势,即关闭自动引用计数并手动管理内存.
我一直想知道ARC是否做得足够好,或者偶尔会丢球.手动分配/释放内存更有效吗?有些人会关闭ARC,因为这是他们习惯的吗?
我应该继续使用ARC吗?如果没有,是否有人知道未来ARC将足够好用的地方?
我正在上课(在Lynda.com上进行基于计算机的培训),教师继续讲述如何使用"发布"来处理对象.本课程创建于2011年,显然Apple已更新其产品,以便自动为您完成发布.虽然我知道我可以回到手动模式并自行发布项目(例如关闭ARC),我的问题是:最佳做法是什么?我应该打开ARC还是关掉它?也许你有一个很好的例子,我应该何时做出这个选择?
此外,如果我完全不在此基础上,您的帮助也会受到赞赏:-)
谢谢.