views:

45

answers:

2

Instruments leaks says that this code leaks:

NSString *name = [file substringToIndex:i];
Layer *actualLayer = nil;
for (Layer *lay in layers) {
    if ([lay.layerName isEqual:name]) {
        actualLayer = lay;
    }
}

name is the leaking object. There are some strange things: it only leaks sometimes, not always (this snippet of code is executed hundreds of time during a normal execution of my app, but it leaks just 3-4 times). The other strange thing is that i suppose the name object to be an autoreleasing object and it is never explicitaly retained or released, so how could it be that it's leaked?

Taking a look at the stack, substringWithRange is called by substringToIndex, so the problem I think it's in the substringToIndex method.

+1  A: 

Leaks occasionally reports false positives. The code you've posted looks fine, so check whether the surrounding code might be causing an issue. Particularly, use Build & Analyze which can pick up many memory management bugs. If you can't find the problem, there's a chance that it doesn't exist (in this particular case using this particular tool).

Bill Bumgarner describes another debugging tactic, using the heapshot instrument which can succeed where leaks fails.

Graham Lee
Build and Analyze says it's allright :\
w4nderlust
Then the probable winner is that Leaks isn't perfect. The static analyser is a much more scientific technique.
Graham Lee
A: 

While the code you supplied above shows no leak, if leaks is saying that a leak occurred on this line:

actualLayer = lay;

Then look at any place before where actualLayer is being assigned, being retained, copied, etc. Leaks isn't a magical "here's exactly where you need to fix things" 99% of the time. It's more "this is where I discovered you leaked, remember, the leak happened sometime before this point."

jer