2011-06-03 87 views
3

我是新來的可可觸摸,和真正的非託管語言在一起。儘管我對語法有了很好的把握,但我在質疑我是否正確釋放了一個對象。釋放一個對象是否會銷燬該對象?

我有一個創建對象的視圖,

Communication *comm = [[Communication alloc] init]; 
[comm doSomething]; 
[comm release]; 

我知道我有,因爲我撥作銷燬這個對象,它不會自動釋放。

我在對象上調用一個方法,該方法向我的服務器發出並獲取信息。當數據返回時,它會拋出一個我的「消息分派器」響應的事件。我不想摧毀對象,直到它從服務器返回 - 這是我的困惑所在。

  1. 如果我在進行調用後直接釋放這個對象,它是否會銷燬對象? (我不想這樣做)
  2. 如何正確地銷燬此對象並將其引發到正在等待的數據之後?這發生在我的comm對象上的DataFinishedLoading事件中。它是否應該摧毀自己,這是否是正確的做法?

調用我的對象的視圖基本上說,創建這個對象,調用這個方法,並且開始你的快樂方式。它不關心它調用方法後會發生什麼 - 無論它是否帶回信息。它只是監聽上的一種方法,以便以後可能會遇到的任何數據。我沒有理由掛在對象的引用上,因爲在我打電話後,我將永遠不會使用同一個實例 - 除了自己清理之外。

回答

3

A release只有在最後一個固定器釋放它時才銷燬對象。

例如,假設您分配了Communication對象。它隱含地保留一次。然後你保留五次。你需要釋放/自動釋放對象六次,直到它被破壞(它的dealloc方法被調用)。

有一個內部計數器,retainCount。當你創建一個對象時,它被設置爲1。現在每retain增加計數器,並且每個release減少它。 autorelease也減少計數器,但不是立即。一旦計數器下降到0 Objective-C知道該對象不再需要並銷燬它(通過調用對象的dealloc)。 警告:不依賴於retainCount,甚至不看它。您應該只關心您的alloc/copy/new/retain調用與以後相應的release/autorelease平衡。

+0

是否可以將我的Communication對象設置爲自動完成後自動釋放? – 2011-06-03 15:51:03

+0

@George:你可以做'comm = [[[Communication [alloc] init] autorelease];',並且一旦你離開了你所做的這個方法,這個對象就會被釋放一次(但你不知道什麼時候,並且不需要關心)。你可能的意思是,*我希望物體一旦完成工作就消失。這很棘手。最好的方法是以某種方式告知工作完成(例如通過委託方法),並讓對象的創建者釋放它。但是,一個對象不應該(自我釋放);或者什麼的,如果這就是你的意思。雖然可能,但這是一種糟糕的風格和混亂。 – DarkDust 2011-06-03 15:57:09

+0

在我從視圖中調用對象並在稍後的日期返回數據之後,Communication對象將向我的應用程序委託發信號通知我的服務器通過訂閱發送了某些內容。那時,通信對象已經完成了所有的工作,而且不再需要它 - 至少是那個實例。在那裏發佈它是否合適?或者是你建議的[自我釋放]? – 2011-06-03 16:00:52

2

在上例中,comm可能在您致電release時被銷燬。這取決於在doSomething期間保留它。

如果您想在異步執行某些操作時保留該對象,請將其放入保留屬性中。當它通知您已完成時,請將該屬性設置爲nil,然後將其釋放。