2009-08-08 27 views
1

因此,在某些情況下,我有一個與刪除對象有關的泄漏。我有一個Tree對象的NSMutableArray(樹對象知道如何繪製自己)。 - 我有一個引用指針(樹*選擇),它基本上指向我最後一次觸摸的任何樹。 - 請注意,*選定的指針是一個弱引用。從陣列和參考指針中刪除後釋放

好吧,到目前爲止這麼好。

問題: 當我刪除一棵樹時出現泄漏。從列表中我確定被刪除的樹在從數組中移除它之前將內部釋放(從數組中移除它應該自動調用釋放)。

我想什麼: 我發現我的樹*選擇指針正在通過自身財產分配感動樹:

self.selected =樹;

...通過這樣做我知道它被保留。所以我試圖做的是:

[self.selected release];

我在從數組中刪除樹後立即調用了它。 ...但在此時它崩潰,基本上聲明它已經發布。

問題: 爲什麼我得到這個錯誤信息?我從數組中刪除它,但是我的self.selected指針仍然有一個保留的計數,因此我不應該釋放它?

也許我應該將它設置爲零後刪除過程? 或者,也許我應該將它設置爲autorelease之前的刪除過程?

+0

讓我修改我的問題: 由於*選定的指針具有數組中對象的保留計數,爲什麼從數組中刪除該對象會導致它被解除分配?事實上,我有一個保留參考它應該已經阻止它被釋放,正確? – 2009-08-08 00:51:37

+0

所以我所做的是分配*選定的指針,而不使用self關鍵字。在完成刪除過程之後,我不會在ref指針上調用釋放,也不會將其設置爲零。 到目前爲止沒有泄漏! – 2009-08-08 00:54:37

+0

媽的。泄漏,泄漏,泄漏,它回來了。 – 2009-08-08 01:03:59

回答

0

[可能]發生的事情是selected指向一個釋放對象,而不是任何東西。

我想嘗試

self.selected = nil; 

而是明確釋放它的。這也應該考慮到保留數量。

1

不要試圖微觀管理你的selected實例變量的保留/釋放。如果你想selected在弱的參考,與assign屬性聲明它:

@property(nonatomic, assign) Tree *selected; 

這樣,當你把值分配給它,它不會被保留。從概念上講,它將「搭載」在您的NSMutableArray保留的參考文獻上。所以,當你從你的NSMutableArray刪除的東西,做到這一點有點像這樣:

if (self.selected == toBeRemoved) 
    self.selected = nil; 
[myArray removeObject:toBeRemoved]; 

如果沒有明確指定assign和你的財產被保留它的內容,你是最有可能得到一個例外,因爲下一個任務到self.selected之後,刪除元素導致另一個-release消息被髮送到已由您的[self.selected release]消息釋放的舊值。

0

基本上,我使用'self'指定我的弱引用,因此內部調用retain。我刪除了'自我',現在事情都很好,很棒。 :) 謝謝!