У меня есть кусок кода Objective-C, который выглядит следующим образом:
- (NSString *)copyData:(NSData *)data
{
NSString *path = [[[self outputDirectory] stringByAppendingPathComponent:@"archive"] stringByAppendingPathExtension:@"zip"];
NSLog(@"Copying data to %@", path);
[data writeToFile:path atomically:NO];
return path;
}
Код вызывается из инициализатора, который выглядит так:
- (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;
}
При запуске статического анализатора clang я получаю следующие предупреждения для переменной path
:
Потенциальная утечка объекта, выделенного в строке 41 и сохраненная в "путь"
Объект с +0 счетчиками, возвращаемыми вызывающему абоненту, где ожидается +1 (владеющий) счетчиком
Я в замешательстве. Я понимаю, что stringByAppendingPathComponent
должен возвращать строку с автореализацией, поэтому у нее должно быть значение net keep count of 0. (Очевидно, я не хочу его сохранять.)
Я попытался изменить copyData:
, чтобы вернуть следующее, но не избавился от предупреждения:
return [[path retain] autorelease];
Итак, что сделка с этим предупреждением?