首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何修复这个clang警告:"Object with +0 retain returned to caller where expected +1 (owning) retain“?

如何修复这个clang警告:"Object with +0 retain returned to caller where expected +1 (owning) retain“?
EN

Stack Overflow用户
提问于 2010-05-15 06:00:15
回答 5查看 3.7K关注 0票数 10

我有一段Objective-C代码,如下所示:

代码语言:javascript
复制
- (NSString *)copyData:(NSData *)data
{
    NSString *path = [[[self outputDirectory] stringByAppendingPathComponent:@"archive"] stringByAppendingPathExtension:@"zip"];
    NSLog(@"Copying data to %@", path);
    [data writeToFile:path atomically:NO];
    return path;
}

代码从如下所示的初始化器中调用:

代码语言:javascript
复制
- (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应该返回一个自动释放的字符串,所以它的净保留计数应该是0。(很明显,我不想保留它。)

我已经尝试修改copyData:以返回以下内容,但它没有摆脱警告:

代码语言:javascript
复制
return [[path retain] autorelease];

那么这个警告是怎么回事呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-15 06:05:07

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

当然,在您的例子中,您指的是文件之类的东西,所以这是一个可以忽略的警告。如果您将方法的名称改为类似于saveData:的名称,我敢打赌警告将消失。

票数 15
EN

Stack Overflow用户

发布于 2010-08-07 01:55:07

此外,当你真的想用' copy‘或其他东西来命名一个方法的时候,因为不管Cocoa内存管理指南,copy是方法的最佳名称,你可以用NS_RETURNS_NOT_RETAINED注释方法声明,然后Clang不会给你一个警告。所以:

代码语言:javascript
复制
// Copies data from data to string; does not follow the copy rule
- (NSString*)copyData:(NSData*)data NS_RETURNS_NOT_RETAINED;
票数 9
EN

Stack Overflow用户

发布于 2010-05-15 06:06:34

根据Memory Management Guide,由于该方法具有名称copy,因此分析器期望返回的对象具有+1保留计数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2837904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档