2012-05-23 44 views
3

我正在對正在創建的應用程序進行調試,但運行的儀器發現內存泄漏,我無法理解。因爲XCode Instruments發現內存泄漏:爲什麼?

消息

如果我試圖修改代碼,下列文書的建議,我的應用程序崩潰發送到釋放實例

有人能幫助我嗎?

- (void) objectAtIndex:(int)index { 
    SpecialObject *specialObj = [SpecialObject sharedInstance]; 

    id model = [self.datasource objectAtIndex:index]; 

    if ([model isKindOfClass:[ClassA class]]) { 
     ClassA *objA = (ClassA *)model; 
     specialObj.title = objA.title; 

    } else if ([model isKindOfClass:[ClassB class]]) { 
     ClassB *objB = (ClassB *)model; 
     specialObj.title = objB.title; 
    } 
} 

self.datasourceNSMutableArrayspecialObj.titleNSString

它們被定義爲@property(nonatomic, retain)

我的問題是儀器告訴我,這2

ClassA *objA = (ClassA *)model; 
ClassB *objB = (ClassB *)model; 

是泄漏,但如果我釋放objAobjB我的應用程序崩潰。

感謝您的幫助!

+0

什麼類型的對象是數據源?它肯定會從該方法返回一個自動釋放對象嗎? –

+0

嗨保羅和感謝:這是一個NSMutableArray(我編輯了第一篇文章)。 –

+0

你能否提供'[self.datasource objectAtIndex:index]'實現? –

回答

0

經過一番搜索,我發現了這個問題:XCode 通常是可以告訴你泄漏的位置,但有時它會給你一個可能的位置。

這意味着內存泄漏在程序流程的某個地方進入XCode指示的位置,並不一定完全位於該位置。

希望這可以幫助別人,將來別人!

0

我的猜測是,你永遠不放開的數據源。您沒有使用ARC,在dealloc方法假設,你應該有

[self setDataSource: nil]; 

[instanceVariableThatBacksDataSourceProperty release]; 

很多人做了前者,但蘋果建議後者使志願未釋放時觸發。

0

的泄漏和您的例外是不同的東西。這個例外幾乎肯定是由於釋放你不應該釋放的東西而引起的。

,你有兩個建議您Objective-C的內存管理的理解是比恆星的事實。

你應該先集中精力去理解例外,並朝着這樣做的第一步是看exception traceback

+0

親愛的熱舔,問題不是我有泄漏和異常;我的問題是,如果我釋放XCode對象,我的應用程序崩潰,如果我不這樣做,它告訴我是一個泄漏 所以如果你的理解比我好,而且我確定這是因爲我是新手,我的問題的解決方案是什麼?我能夠讀取異常tr aceback,它回到了我在我的問題中發佈的觀點。 –