【问题标题】:Object Array in Objective C with ARC带有ARC的Objective C中的对象数组
【发布时间】:2013-04-18 04:34:50
【问题描述】:

我正在编写一个我想加快速度的应用程序。我想到的一种方法是从使用 NSArrayNSMutableArray 切换到使用直接 c 样式的指针数组。

我曾天真地尝试过:

MyObject** objects = (MyObject**) malloc(N/2*sizeof(MyObject*))

这会在使用 ARC 时报告编译器错误,因为它不知道如何处理 ** 对象; 这可以通过添加桥指令来解决。

我的问题是如何处理这些内存以及如何混合 C 和 Objective-C 对象进行内存管理。

两种解决方案

MyObject* __weak* objects = (MyObject* __weak*) malloc(N/2*sizeof(MyObject*));

MyObject* __strong* objects = (MyObject* __strong*) malloc(N/2*sizeof(MyObject*));

这两个数组有什么区别,完成后如何释放/释放它们。 NSArrays 是否已优化到不会大幅提升速度的程度?

【问题讨论】:

  • CFArray 进行了高度优化(低至 ASM 级别)。您需要放宽视野,并尽量不要像这样进行微优化,因为现在您已经创建了内存头痛和指针安全问题,其中存在(次要)速度问题。
  • 个人资料。不要猜测。学习如何使用仪器。查看 Apple's developer videos 获取入门帮助。
  • CodaFi:CFArray 现在实际上比 NSArray 慢一些,而且肯定没有优化“到 asm 级别”。虽然它非常快,所以如果没有可靠的分析数据,我不会责怪它。
  • @Catfish_Man 然后 CLANG 做得非常好,将它降到了那个水平。
  • 事实证明,极端的简单性加上一些技巧可以得到非常好的代码生成,而不必费尽心思:)

标签: ios objective-c c nsarray automatic-ref-counting


【解决方案1】:

NSArrays 是否已优化到不会导致其加速的程度?

是的。

您应该在 Instruments 中分析您的代码 - 即使您大量使用数组,您也会发现您的代码大部分时间都花在了 NSArray 方法以外的地方,例如 -objectAtIndex:

更进一步,应该真的能够告诉我们 NSArray 是否已经充分优化,你不需要改进它。如果您希望通过替换 NSArray 来加速您的代码,您应该已经对您的代码进行了概要分析并确定了昂贵的部分。不要只是猜测需要改进的地方;测量一下。

【讨论】:

  • 另外 -objectAtIndex: 通常可以被批量访问器替换,例如 for(in)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 2012-07-27
  • 1970-01-01
相关资源
最近更新 更多