相关疑难解决方法(0)

Objective-C自动引用计数和垃圾收集有什么区别?

通过Xcode 4.2中引入的新自动引用计数(ARC),我们不再需要在Objective-C中手动管理保留/释放.

这看起来类似于垃圾收集,就像Mac上的Objective-C和其他语言一样.ARC如何与垃圾收集不同?

iphone garbage-collection ios automatic-ref-counting

55
推荐指数
3
解决办法
2万
查看次数

ARC,值得与否?

当我从C++(和小Java)转移到Objective C(iOS)时,我很难理解iOS中的内存管理.但现在这一切看起来很自然,我知道保留,自动释放,复制和发布的东西.在阅读了ARC之后,我想知道使用ARC有什么好处,或者只是你不必担心内存管理.在转向ARC之前,我想知道如何转向ARC.

  1. XCode具有"转换为Objective C ARC"菜单.转换是否那么简单(没什么可担心的)?
  2. 它有助于我减少我的应用程序内存占用空间,内存泄漏等(不知何故?)
  3. 它对我的应用程序有很大的测试影响吗?
  4. 什么是非显而易见的优势?
  5. 搬到它的任何不利之处?

memory memory-management ios ios5 automatic-ref-counting

18
推荐指数
3
解决办法
6495
查看次数

有没有关于使用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慢吗?

这取决于你测量的是什么,但通常是"不".

显然应该理解为

\ {开始模仿}

嗯......哼......我们不能说它慢一点,因为这是一个新的酷技术,我们希望你采用它.所以我们用双引号回答"否"只是为了避免集体诉讼.并停止问愚蠢的问题.

\ {端模仿}

\ {端讽刺}

performance objective-c automatic-ref-counting

12
推荐指数
2
解决办法
1091
查看次数

双指针作为Objective-C块参数

是否有可能(如果是这样,安全)创建/使用以双指针作为参数的块?

例如:

- (void)methodWithBlock:(void (^)(NSError **error))block;


其他背景,研究和问题:

  • 我正在使用ARC.
  • 当我声明上面的方法并尝试调用它时,XCode自动完成我的方法调用,如下所示:这里的意思是[self methodWithBlock:^(NSError *__autoreleasing *error) {}]; 什么__autoreleasing,为什么要添加它?我认为它与ARC有关.
  • 如果这可行且安全的,那么指针是否仍然可以在块中取消引用,就像在其他任何地方一样?
  • 一般来说,做我正在描述的内容和简单地将双指针作为方法参数(例如- (void)methodWithDoublePointer:(NSError **)error;)传递之间有什么重要区别?应该考虑哪些特殊考虑因素(再次假设这是可能的)?

objective-c objective-c-blocks

7
推荐指数
1
解决办法
1640
查看次数

如何在非ARC下归零弱引用?

我不喜欢ARC.

但ARC的最重要特征是归零弱参考,在非ARC下缺失.目前我正在使用MAZeroingWeakRef,它可以工作,但hacky,有时会使代码多余.将弱引用归零的任何其他方法?

cocoa weak-references automatic-ref-counting

5
推荐指数
1
解决办法
2377
查看次数

在部署到iOS 4.x时,ARC是否可以安全使用?

我们正在开发一个我们想要在iOS 4.3及更高版本上运行的应用程序.

我们的高级开发人员认为使用ARC是一件坏事,并且会导致iOS 5以下的任何事情发生崩溃和问题.这是真的吗?在iOS 4.3上使用ARC时会出现什么问题?

我知道你必须使用unsafe_unretained而不是弱引用.这可能导致什么问题?

如果我们也在为iOS 4.3开发,我们是否应该根本不使用ARC?或者是否可以使用ARC为iOS 5及以上版本和iOS 4.3开发可靠的应用程序?

ios automatic-ref-counting

2
推荐指数
1
解决办法
1735
查看次数

使用自动引用计数或不使用

我目前正在学习Objective C,到目前为止我一直在使用自动引用计数和我的所有项目.然而,在与一些同事交谈之后,在网上查看了一些论坛后,我注意到了一种趋势,即关闭自动引用计数并手动管理内存.

我一直想知道ARC是否做得足够好,或者偶尔会丢球.手动分配/释放内存更有效吗?有些人会关闭ARC,因为这是他们习惯的吗?

我应该继续使用ARC吗?如果没有,是否有人知道未来ARC将足够好用的地方?

objective-c automatic-ref-counting

2
推荐指数
1
解决办法
1142
查看次数

在Objective C中使用发布的最佳实践

我正在上课(在Lynda.com上进行基于计算机的培训),教师继续讲述如何使用"发布"来处理对象.本课程创建于2011年,显然Apple已更新其产品,以便自动为您完成发布.虽然我知道我可以回到手动模式并自行发布项目(例如关闭ARC),我的问题是:最佳做法是什么?我应该打开ARC还是关掉它?也许你有一个很好的例子,我应该何时做出这个选择?

此外,如果我完全不在此基础上,您的帮助也会受到赞赏:-)

谢谢.

memory-management objective-c ios automatic-ref-counting

1
推荐指数
1
解决办法
119
查看次数