I have a piece of Objective-C code that looks like the following:
- (NSString *)copyData:(NSData *)data
{
NSString *path = [[[self outputDirectory] stringByAppendingPathComponent:@"archive"] stringByAppendingPathExtension:@"zip"];
NSLog(@"Copying data to %@", path);
[data writeToFile:path atomically:NO];
return path;
}
The code is called from an initializer that looks like this:
- (id)initWithData:(NSData *)data
{
if ((self = [super init]) != nil) {
NSString *path = [self copyData:data]; // Line 41 (referenced in warning, shown below)
return [self initWithContentsOfFile:path];
}
return self;
}
When running the clang static analyzer, I get the following warnings for the path
variable:
Potential leak of an object allocated on line 41 and stored into 'path'
Object with +0 retain counts returned to caller where +1 (owning) retain count is expected
I'm confused. My understanding is that stringByAppendingPathComponent
should return an autoreleased string, so it should have a net retain count of 0. (Obviously I don't want to retain it.)
I've tried altering copyData:
to return the following, but it didn't get rid of the warning:
return [[path retain] autorelease];
So what's the deal with this warning?