Objective c 使用ARC保持/释放正在减慢我的速度

Objective c 使用ARC保持/释放正在减慢我的速度,objective-c,automatic-ref-counting,Objective C,Automatic Ref Counting,我正在iOS应用程序中使用ARC。我已经介绍了下面的方法,尽管算法非常幼稚和浪费,但77%的时间都花在objc_-retain和objc_-release上。我想这一定是因为我从NSArray取了一个单位,ARC每次都会小心地保留然后释放这个对象 我正在寻找一个明智的建议:如何优雅地修复它 -(CGFloat)getUncertaintyForUnits:(NSArray*)units Position:(MKMapPoint)position Zoom:(MKZoomScale)zoomSca

我正在iOS应用程序中使用ARC。我已经介绍了下面的方法,尽管算法非常幼稚和浪费,但77%的时间都花在
objc_-retain
objc_-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;
}
-(CGFloat)获取单位的不确定性:(NSArray*)单位位置:(MKMapPoint)位置缩放:(MKZoomScale)zoomScale{
CGFloat=MAXFLOAT;
对于(int i=0;i<[单位计数];i++){
单位*单位=(单位*)[单位对象索引:i];
CGFloat距离=[点之间的自距离:unit.mapPoint和:position];
if(距离<最近距离){
最近距离=距离;
}
}
CGFloat max=100/缩放比例;
返回值(1.-最近值/最大值)*0.9;
}
您可以尝试:

for(单位*单位){
CGFloat距离=[点之间的自距离:unit.mapPoint和:position];
if(距离<最近距离){
最近距离=距离;
}
}
这应该避免额外的保留/释放,因为在快速枚举中,整个数组被阻塞

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

  • 枚举的效率远远高于,例如, 直接使用分子
  • 语法简洁
  • 枚举是 “安全”-枚举器有一个变异防护,因此如果您试图 在枚举期间修改集合,将引发异常

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


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

这与使用
getObjects:range:
多少相同?快速枚举通常比
getObjects:range:
快得多,特别是对于单个枚举<代码>获取对象:范围:复制。快速枚举确实不行。快速枚举是一个奇妙的Objective-C功能,它为编译器提供了更多关于您想要完成的任务的信息,以便它能够更好地完成工作。只是一个旁注:它会说,`appoints:And:`之间的距离是一个相当坏的名字。它是
camelCase:forAllParameters:
和…
表示可能会触发某个操作,而要求您将
与…:
一起使用。sou在您的情况下,最好的名称是:
distance-between-appoint:position:
谢谢,我将通读下一次要介绍的命名约定:)
for (Unit *unit in units) {
    CGFloat distance = [self distanceBetweenMapPoints:unit.mapPoint And:position];
    if (distance < closest) {
        closest = distance;
    }
}