2012-02-23 47 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

相關問題