【问题标题】:Xcode static analyser & memory leakXcode 静态分析器和内存泄漏
【发布时间】:2012-06-22 01:20:45
【问题描述】:

感谢您的光临。

这个静态分析器警告让我很烦 这是我的代码

+ (INURLConnection*)createConnectionForRequest:(INHTTPRequest *)aRequest {

    INURLConnection* result = [[INURLConnection alloc] init];
    if(result){
        result.request = aRequest;
        result.error = nil;
    }
    return result;
}

“返回结果”行向我显示潜在的内存泄漏警告(当我使用分析器时)。这是一个create方法,消费的方法是这样的

INURLConnection *connection_tmp = [INURLConnection createConnectionForRequest:aRequest];
self.connection = connection_tmp, [connection_tmp release];

所以创建连接返回保留计数为 1, self.connection 增加了保留计数,并且还有一个释放。

我知道我可以使用 ARC,但我想知道为什么静态分析器在这里显示潜在的内存泄漏。

忽略此警告是否安全?

干杯 阿伦

【问题讨论】:

  • @borrrden 是的,命名约定错误,我重命名了函数然后警告消失了,所以现在它遵守规则。 @tim Potter 感谢您的回答。如果我不遵循命名约定,我确实需要自动释放。我让自己对 CFCreatefunctions 感到困惑。欢呼阿伦

标签: objective-c memory-management


【解决方案1】:

忽略此警告是不安全的,因为您违反了 Cocoa 内存管理的“规则”之一:“您不拥有通过引用返回的对象”。

将函数的最后一行更改为

return [result autorelease];

Xcode 警告应该会消失。

您应该阅读 Apple 关于该主题的文档 Basic Memory Management Rules,其中更详细地介绍了各种约定。遵守这些规则是很好的,因为其他阅读或使用您的代码的人都会期望它以这种方式运行。

【讨论】:

  • 但是,如果您将方法重命名为 newConnectionForRequest,那么它会遵循您提供的文档中提到的命名约定,并且警告应该会消失,因为分析器现在希望该方法返回 +1对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
相关资源
最近更新 更多