2012-02-23 74 views
2

我正在查看仪器的泄漏报告。我的一些泄漏指向SBJSON的方法。我很难相信返回的值不是自动发布的,但是在遍历代码时,它变得非常单调乏味,包括使用call-by-reference返回值。我不认为代码追踪是正确的方式来看待这一点。Objective-C有没有办法判断对象是否设置为autorelease?

有没有办法告诉如果任何对象的自动释放池内保留? (我没有使用ARC)

UPDATE

这里是仪器指向我的一些代码:

- (NSString *) processResults:(NSString *) resultsGeoCodeString { 

    NSDictionary *resultsGeoCode = [resultsGeoCodeString JSONValue]; // <--- 100% 
    ... 

我认为“100%”是指所有泄漏的报道对于这种情况起源于这一行。

我不释放对象resultsGeoCode因为我假设它会被自动释放。

我使用的SBJSON套件没有使用ARC。

+0

图书馆可能使用ARC? – dasdom 2012-02-23 08:50:51

+0

我用一些有问题的代码更新了我的问题。我应该补充说明所显示的代码是在一个单例中。我想知道如果这可能导致它不被autoreleased。如果是这样,我仍然不知道该怎么做。 – Jim 2012-02-23 16:17:30

回答

2

一般来说,知道如果对象是在自动释放池是无益的。你可能会从方法中获得一个自动释放的对象,或者你可能会得到一个常量对象,或者是一个单独的对象,或者是一个为了自己的目的而保留在内部的对象。

开始与假设,它是你的代码,而不是SBJSON,是造成泄漏。 (SBJSON是一个非常受欢迎和使用良好的库,因此可能没有任何严重的泄漏了。)然后检查你对泄漏对象做了什么。例如,你是否把它放在一个永远不会因任何原因而被释放的数组中。你是否在一个没有autorelease池的线程上自动释放它,等等。尝试在这里张贴你的代码。其他人可能能够发现泄漏。

+0

+1“假设它是你的代码开始” – phlebotinum 2012-02-23 11:18:54

1

这是原始的,但是你可以重写自动释放,释放和保留的方法(将消息传递到超),并设置日志消息计数器(如果有必要继承)。不幸的是,我不知道另一种方法,因为retainCount在这里帮不了你。

2

泄漏是显示您造成的泄漏的分配,而不是导致过度保留的代码行的代码行。按照周围的resultsGeoCode字典;假定库中没有错误,那么在某个地方就会过度保留该对象。

您可以使用工具来显示任何给定对象的所有保留/释放事件。

+0

感谢您的提示。我得晚点再做。我现在不在那台电脑上。但是我会跟进你的情况。 – Jim 2012-02-23 18:05:28

+0

我仍在处理此问题。我认为这个问题是在错误地处理某些NSDictionary的地方。但是我正在学习如何同时使用乐器,所以这比我预期的要长一些。但这是非常值得的。 – Jim 2012-02-24 07:54:57

相关问题