mip*_*adi 10 cocoa objective-c clang clang-static-analyzer
我有一段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;
}
Run Code Online (Sandbox Code Playgroud)
从初始化程序调用代码,如下所示:
- (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;
}
Run Code Online (Sandbox Code Playgroud)
运行clang静态分析器时,我得到以下path变量警告:
第41行分配的对象的潜在泄漏并存储在"路径"中
具有+0保留计数的对象返回给调用者,其中预期+1(拥有)保留计数
我糊涂了.我的理解是stringByAppendingPathComponent应该返回一个自动释放的字符串,所以它应该有一个净保留计数为0.(显然我不想保留它.)
我已经尝试改变copyData:以返回以下内容,但它没有消除警告:
return [[path retain] autorelease];
Run Code Online (Sandbox Code Playgroud)
那么这个警告的处理是什么?
Ben*_*tto 15
我怀疑它只是注意到带有前缀的方法并将其copy标记为应该返回调用者拥有的内容,因为它认为它遵循Cocoa命名约定.
在你的情况下,当然,你指的是文件和诸如此类的东西,所以这是一个可忽略的警告.如果您更改方法的名称,改为saveData:相反,我打赌警告将消失.
此外,对于你确实想要用'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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3696 次 |
| 最近记录: |