2010-05-25 60 views
0

[我敢肯定,這不是奇怪可言,但我只需要一點幫助]保留計數問:一些指導,請

我有兩個retain性質

@property (nonatomic, retain) NSArray *listContent; 
@property (nonatomic, retain) NSArray *filteredListContent; 

和該viewDidLoad方法我設置第二個等於第一(所以現在的retainCount是二,我認爲):

self.filteredListContent = self.listContent; 

,然後每一個搜索我這樣做

self.filteredListContent = [listContent filteredArrayUsingPredicate:predicate]; 

,我想我應該做一個release權這個任務上面 - 因爲屬性應該引起額外的保留,對不對? - 但這會導致程序在第二次運行搜索方法時爆炸。在保留計數(沒有額外release)是2我第一次接觸到的搜索方法,以及各1個隨後的時間(這是我所期待的,可惜)。

一些指導將幫助,謝謝!不釋放是否正確?

回答

3

您不必將其釋放,這是正確的。

由於變量存儲在兩個位置,其保留計數應該爲2.下面是它崩潰的原因。 (保留括號self.listContent的數量。)

 
self.listContent = someArray    [1] 
self.filteredListContent = self.listContent [2] 
[self.filteredListContent release]   [1] 

self.filteredListContent = somethingElse [0] -> deallocation of listContent 
[self.listContent doSomething]    [whoops, bad things happen] 

self.listContent被太早釋放。如果你不使用[... release]它保留計數數學運作。

閱讀Vincent Gable's blog瞭解何時使用版本。 (有趣的是,這篇博文的靈感來源於Andiih's answer on Stackoverflow。)

+1

我認爲你的意思是[self.filteredlistContent發佈]在第3行,但否則很好的解釋 – h4xxr 2010-05-25 20:07:18

+0

是不是比其他人會推薦它更頻繁地使用'autorelease'的博客文章? – 2010-05-25 20:14:47

+0

@yar:你知道'self.filteredListContent'等於'self.listContent'和'someArray'在那行嗎?發佈哪一個並不重要,它都是同一個對象。 (當然這隻有在屬性不是複製屬性的情況下才適用。) – 2010-05-26 16:22:08

2

不,你不需要做出retain呼叫之前運行過濾搜索。該物業的任何舊值將被釋放。

您第一次檢查保留計數時,self.filteredListContentself.listContent引用相同的數組對象,並且都有該數組的引用計數器。在搜索self.listContent的保留計數下降到1之後,因爲它在搜索結果被設置(並隨後保留)時被self.filteredListContent釋放。

+0

優秀,這是非常有意義的。 – 2010-05-25 20:10:55

2

如果你沒有NARC *的對象,你不需要release它。

* NARC - 新的,分配,保留,複製

一個保留的財產分配上兩者retain S中的新價值release一箇舊的值,當這種情況發生。

+0

謝謝,我的錯誤現在已經很清楚了,我忘記了'retain'屬性在獲取它時基本上正在執行一次保留操作,而當它發生新的操作時就會釋放它。 – 2010-05-25 20:12:19

+2

你的意思是「新的alloc保留副本」! – 2010-05-26 00:20:44

+1

正確的你是!固定! – bbum 2010-05-26 17:16:53