Retain/release with ARC is slowing me down

automatic-ref-counting, objective-c

Solution

you could try fast enumeration:

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

this should avoid extra retains/releases, as in fast enumeration the whole array is blocked.

There are several advantages to using fast enumeration:

- The enumeration is considerably more efficient than, for example, using NSEnumerator directly.

- The syntax is concise.

- Enumeration is “safe”—the enumerator has a mutation guard so that if you attempt to modify the collection during enumeration, an exception is raised.

Problem

I'm using ARC in my iOS app. I have profiled the method below and even though the algorithm is terribly naive and wasteful 77% of the time is spent in `objc_retain` and `objc_release`. I think it must be down to the line where i fetch a Unit from the `NSArray` and ARC is careful to retain and then release the object each time. I'm looking for an informed advice: how do I fix it elegantly? ``` -(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; } ```

Original source