我有一段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
应该返回一个自动释放的字符串,所以它的净保留计数应该是0。(很明显,我不想保留它。)
我已经尝试修改copyData:
以返回以下内容,但它没有摆脱警告:
return [[path retain] autorelease];
那么这个警告是怎么回事呢?
发布于 2010-05-15 06:05:07
我怀疑它只是注意到一个前缀为copy
的方法,并将其标记为应该返回调用者拥有的东西,因为它认为它遵循Cocoa命名约定。
当然,在您的例子中,您指的是文件之类的东西,所以这是一个可以忽略的警告。如果您将方法的名称改为类似于saveData:
的名称,我敢打赌警告将消失。
发布于 2010-08-07 01:55:07
此外,当你真的想用' copy‘或其他东西来命名一个方法的时候,因为不管Cocoa内存管理指南,copy是方法的最佳名称,你可以用NS_RETURNS_NOT_RETAINED
注释方法声明,然后Clang不会给你一个警告。所以:
// Copies data from data to string; does not follow the copy rule
- (NSString*)copyData:(NSData*)data NS_RETURNS_NOT_RETAINED;
发布于 2010-05-15 06:06:34
根据Memory Management Guide,由于该方法具有名称copy
,因此分析器期望返回的对象具有+1保留计数。
https://stackoverflow.com/questions/2837904
复制相似问题