2011-09-15 50 views
0

我知道這個問題曾經討論過很多次,但我有一個簡單的問題。我知道這個:dealloc和發佈問題

如果我分配一個對象,我擁有它並且必須釋放它。所以我必須做的:

ran *me = [[ran alloc] init]; 
//do somthing 
[me release]; 

所以現在,保留計數爲0,我釋放後運行對象。

但我也讀過,當一個對象的保留計數爲0時,正在調用dealloc方法。

所以我的問題是,在我將保留計數降爲0之後,我是否必須再次釋放dealloc中的對象?

-(void)dealloc 
[me release]; 

還是說第一個版本做的工作?否則,爲什麼要調用dealloc?如果保留計數= 0,我們確定沒有?

非常感謝。

回答

1

不,你不需要在那裏再次發佈 - 事實上,不要這樣做!

dealloc被調用的原因是可能發生清理。例如,如果您在班級中分配了內存,則可以在該處釋放內存。並且請記住,保留計數可能會達到2,3,4,5 ....因此,僅僅因爲release已完成,您(作爲該類的外部用戶)不知道應該調用dealloc。這就是它與發佈版本不同的地方。

有一點要注意的是,當計數達到0時,dealloc方法可能不會立即運行。它可能會在晚些時候完成。

+0

爲什麼保留計數可能是2,3,4?每次我分配它,我釋放它,所以它應該永遠不會更多,除非在alloctaion後,我有另一個,所以它的2,然後dealloc被稱爲?如果是這樣,在保留完全dealloc的次數之後?是不是確切的科學?我不知道什麼時候?所以如果每次分配都在某個時候釋放,我確定嗎? – Curnelious

+1

@Rant - 也許在這種情況下,你只有1 ..但是一般來說在編程語言中,你當然可以[object retain];將計數增加到2,3。當你達到0時,無論你如何到達那裏,都會調用dealloc。但不是立即 - 它發生在運行時的閒暇時間。關鍵是,是的,計數必須變爲0才能釋放內存,並在這種情況發生時調用dealloc。 – Nektarios

+0

謝謝,但如果計數爲0,所以系統內存是好的,爲什麼dealloc被調用? 0意味着 - 沒有內存泄漏?蘋果文件只是不清楚。 – Curnelious

1

取決於變量「me」是實例變量,還是稱爲「ivar」。

對於ivars,你把release放在dealloc中。對於其他所有內容,您必須按照您創建它的相同方法釋放它。

當然,除非它是一個自動釋放的對象,但是這是一個不同的故事......

+0

你在這裏說的很奇怪。根據蘋果的說法,每一個分配都應該在你完成對象之後以該方法釋放。他們從來沒有提到ivars(你的意思是財產保留?),所以如果我釋放它後,它爲什麼dealloc被稱爲? – Curnelious

0

首先,我想你的意思[我放開]

其次你只有在dealloc中釋放它,如果你保留在.h文件中,如 @property(nonatomic,retain)ran * me;

使用此設置,將* me的保留設置爲1,然後在.m文件中將init初始化爲2,然後您必須將* me釋放兩次。第一次爲alloc init,第二次在dealloc中保留在.h

希望這會有所幫助。

+0

什麼?我無法理解你剛剛說的什麼。它與蘋果文件完全不同。檢查我的問題和答案。我沒有談論保留,而是關於在m文件中分配另一個類的類。這應該釋放不dealloc,但後alloc。 – Curnelious

+0

是的,這應該釋放不dealloc,但在alloc和我解釋了爲什麼。如果您不使用@property retain,則不使用 - (void)dealloc。所以我認爲這是你的問題的答案。 :) – Retterdesdialogs