用ARC保留/释放让我失望

时间:2012-06-09 20:07:32

标签: 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;
}

2 个答案:

答案 0 :(得分:10)

您可以尝试fast enumeration

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

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

  

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

     
      
  • 枚举比例如,效率更高   直接使用NSEnumerator。
  •   
  • 语法简洁。
  •   
  • 枚举是   “安全” - 普查员有一个变异防守,所以如果你试图   在枚举期间修改集合,引发异常。
  •   

答案 1 :(得分:0)

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

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