У меня есть фрагмент кода 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 и сохраненного в 'path'
Объект с +0 счетчиками удержания возвращается вызывающей стороне, где ожидается +1 (владеющий) счетчик удержания
Я смущен. Насколько я понимаю, stringByAppendingPathComponent
должен возвращать автоматически выпущенную строку, поэтому он должен иметь чистый счетчик сохранения 0. (Очевидно, я не хочу сохранять его.)
Я попытался изменить copyData:
, чтобы вернуть следующее, но это не избавило от предупреждения:
return [[path retain] autorelease];
Так в чем же дело с этим предупреждением?