我该如何解决这个clang警告:“+0保留计数的对象返回给调用者,其中+1(拥有)保留计数是预期的”?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (111)

我有一段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;
}

运行铛静态分析器时,我得到以下path变量警告:

第41行分配的对象的潜在泄漏并存储在“路径”中 具有+0保留计数的对象返回给调用者,其中+1(拥有)保留计数是预期的。

我很困惑。我的理解是stringByAppendingPathComponent应该返回一个自动释放的字符串,所以它应该有一个净保留计数为0.(显然我不想保留它。)

我尝试改变copyData:以下内容,但没有摆脱警告:

return [[path retain] autorelease];

那么这个警告是怎么处理的?

提问于
用户回答回答于

我怀疑它只是注意到一个带有前缀copy和标记的方法,它应该返回调用者拥有的东西,因为它认为它遵循可可命名约定。

就你而言,当然,你指的是文件和其他东西,所以这是一个可以忽略的警告。如果你更改方法的名称,改为saveData:相反,我打赌警告会消失。

用户回答回答于

你的方法“copyData”包含单词“copy”,暗示调用者应拥有(并释放)结果。但是,你返回的结果已被autoreleased,因此它给你的错误信息。如果你想修复错误,请不要自动释放。那是:

 return [path retain]

你可以更改函数的名称,使其符合内存管理指南。

无论如何,恕我直言,“copyData”这个名字是不直观的。我建议你将你的函数重命名为“pathToSavedDataWithData”等。有些说明它实际上在做什么。

扫码关注云+社区

领取腾讯云代金券