我正在查看仪器的泄漏报告。我的一些漏洞指向方法SBJSON。我很难相信返回的值不是自动释放的,但在跟踪代码时,它变得非常繁琐,包括使用call-by-reference返回值。我不认为代码跟踪是正确的方式来看待它。
有没有办法判断自动释放池中是否保留了任何对象? (我没有使用ARC。)
更新
以下是Instruments指出的一些代码:
- (NSString *) processResults:(NSString *) resultsGeoCodeString {
NSDictionary *resultsGeoCode = [resultsGeoCodeString JSONValue]; // <--- 100%
...
我认为“100%”表示此案例报告的所有泄漏都来自此行。
我没有释放对象resultsGeoCode
,因为我假设它是自动释放的。
我使用的SBJSON套件不使用ARC。
答案 0 :(得分:2)
一般来说,了解对象是否在自动释放池中是没有用的。您可以从方法中获取一个自动释放的对象,或者您可以获得一个常量对象或单个框架或框架为了自己的目的而在内部保留的对象。
首先假设它是您的代码而不是导致泄漏的SBJSON。 (SBJSON是一个非常受欢迎且使用良好的库,因此可能不再有任何严重的泄漏。)然后检查你对泄漏对象做了什么。例如,您是否将它放在一个永远不会因任何原因而被释放的数组中。您是否在没有自动释放池的线程上自动释放它,依此类推。尝试在此处发布代码。其他人可能能够发现泄漏。
答案 1 :(得分:2)
泄漏向您显示导致分配泄漏的代码行,而不是导致过度保留的代码行。关注resultsGeoCode
词典;假设库中没有错误,那么某个地方就会过度保留该对象。
您可以使用Instruments显示任何给定对象的所有保留/释放事件。
答案 2 :(得分:1)
这是原始的,但您可以覆盖autorelease,release和retain方法(将消息传递给super)并使用计数器设置日志消息(必要时进行子类化)。不幸的是我不知道另一种方法,因为retainCount在这里对你没什么帮助。