用ARC保留/释放让我失望

Mac*_*iło 4 objective-c automatic-ref-counting

我在我的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;
}
Run Code Online (Sandbox Code Playgroud)

Vik*_*ica 10

你可以尝试快速枚举:

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

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

使用快速枚举有几个好处:

  • 枚举比例如直接使用NSEnumerator更有效.
  • 语法简洁.
  • 枚举是"安全的" - 枚举器具有变异防护,因此如果您在枚举期间尝试修改集合,则会引发异常.

  • 快速枚举通常比`getObjects:range:`快得多,特别是对于单个枚举.`getObjects:range:`制作副本.快速枚举不会. (2认同)