4

我在我的 iOS 应用程序中使用 ARC。我已经介绍了下面的方法,尽管该算法非常幼稚和浪费,但 77% 的时间都花在了objc_retainobjc_release. 我认为它必须归结为我从中获取一个单元的行,NSArray并且 ARC 每次都小心地保留然后释放对象。

我正在寻找一个明智的建议:我如何优雅地修复它?

-(CGFloat)getUncertaintyForUnits:(NSArray*)units Position:(MKMapPoint)position Zoom:(MKZoomScale)zoomScale {

    CGFloat closest = MAXFLOAT; 

    for (int i = 0; i < [units count]; i++) {
        Unit *units = (Unit*)[units objectAtIndex:i];

        CGFloat distance = [self distanceBetweenMapPoints:unit.mapPoint And:position];

        if (distance < closest) {
            closest = distance;
        }
    }

    CGFloat max = 100 / zoomScale;
    return  (1. - closest / max) * 0.9;
}
4

2 回答 2

10

你可以尝试快速枚举

for (Unit *unit in units) {
    CGFloat distance = [self distanceBetweenMapPoints:unit.mapPoint And:position];
    if (distance < closest) {
        closest = distance;
    }
}

这应该避免额外的保留/释放,因为在快速枚举中整个数组都被阻塞了。

使用快速枚举有几个优点:

  • 例如,枚举比直接使用 NSEnumerator 更有效。
  • 语法简洁。
  • 枚举是“安全的”——枚举器有一个突变保护,因此如果您在枚举期间尝试修改集合,则会引发异常。
于 2012-06-09T20:15:47.457 回答
0

除非您出于某种原因需要内存管理对象,否则一种更快的替代方法是将您的位置点存储在常规 C 数组(或结构数组)中。

Objective C 是常规 ANSI C 的超集。有时,OOP 超集构造的好处不超过对象运行时消息传递和内部循环管理的成本。

于 2012-06-09T21:00:12.440 回答