2012-02-13 85 views
1

我試圖創建釋放我還沒有發佈任何理由卻把對象的方法。我想補充這對我的ViewController的dealloc方法:釋放對象還沒有被釋放的Objective-C的

for (id object in [self.view subviews]){ 
    NSLog(@"/n") ; 
    NSLog(@"%@", object) ; 

    if([object isKindOfClass:[UIView class]]){ 
     if (malloc_size(object)>0) { 
      NSLog(@"-> Releasing object with size: %zd", malloc_size(object)) ;  
      [object release] ; 
     } 
    } 
} 

不幸的是,應用程序崩潰。我究竟做錯了什麼?

+2

對於某些UI GC,這看起來像是一個狡猾的嘗試,你試圖解決的問題是什麼讓你認爲你需要這樣做? – AnthonyBlake 2012-02-13 15:46:08

+0

爲什麼你想釋放這些?你保留了他們嗎?一般情況下,你不需要手動保留/釋放子視圖:這是由UIView的基類來處理。 – smparkes 2012-02-13 15:46:31

+0

我想確保我每天釋放的對象,但據我所看到的,不正確的方式。非常感謝! – RGML 2012-02-13 16:05:54

回答

4

我在做什麼錯?

你沒有平衡你的保留和發佈。你不應該在你的例子中需要這樣的代碼。如果您保留某些內容,請在完成後釋放它。其他任何事情都在乞求麻煩。

在這段代碼中明確,你釋放所有視圖的子視圖。你的代碼是否保留了每一個觀點?如果不是,你不應該釋放它們。如果是的話,爲什麼?你是否分別引用每一個?您的視圖將保留您添加爲子視圖的任何視圖;你只需要保留它們,如果你有其他的參考(和一些人選擇不保留即使)。

+0

對我有意義,非常感謝! – RGML 2012-02-13 16:06:12

1

您釋放的對象可能已經發布,並且只保留在將其保存爲子視圖的視圖中。由於您的版本不會從其超級視圖中刪除該視圖,因此最終會在視圖層次結構中出現死對象。當視圖被重新分配或重繪其所有子視圖時,這會崩潰。

1

在大多數情況下,您首先必須從超級視圖中刪除視圖,否則您將釋放超級視圖仍然需要或保持引用的對象。

而且你不應該這樣做,你應該保留和釋放之間保持良好平衡。

作爲一個額外的,這是我真的不知道的東西:是否正確使用malloc_size