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?