將被調用,只要保留該對象的 計數變爲零,最好的地方我讀過的dealloc的對象。
是的。
爲了簡單起見,請將包含currentColor
對象的類稱爲ColorContainer
。現在,如果你創建的ColorContainer
像下面的一個實例:
ColorContainer* containerColor = [[ColorContainer alloc] init]; // retain count + 1
爲containerColor
保留計數變爲1。
假設您創建了一個UIColor
的實例,並將該實例設置爲currentColor
屬性。在這種情況下,您可以採用兩種不同的方式。 在第一個中,您可以創建如下的實例。如果您使用像initWithRed:green:blue:alpha:
這樣的實例方法,則必須明確釋放內存。
UIColor color* = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:1]; // retain count + 1
containerColor.currentColor = color; // retain count +1, the referenced object has a retain count of 2 because you use a retain policy
[color release]; // retain count -1, now the referenced object has a retain count of 1
在第二種方法中,您可以使用類方法(+符號)。在這種情況下,您不需要釋放內存顯式,因爲在該類方法中創建的對象將在應用程序生命週期的某個時間點自動釋放。
containerColor.currentColor = [UIColor whiteColor]; // retain count +1
現在假設您發佈了containerColor
對象。如果containerColor
的保留計數等於1,則將其從使用該對象的對象中釋放,它允許調用其dealloc方法,因此也可以消除由currentColor
引用的對象。
在你要注意到,currentColor
引用的對象是完全從內存(解僱)移除了這個簡單的案例,只有當它有保留的。事實上計數,如果你這樣做
UIColor color* = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:1]; // retain count + 1
containerColor.currentColor = color; // retain count +1, the referenced object has a retain count of 2
//[color release];
你創建了一個內存泄漏(你明白了嗎?)。
總之,當你使用retain
,copy
,init
或new
(這是相同的alloc-init
),你必須總是叫對口release
或autorelease
。
作爲一個經驗法則,您需要總是平衡對象的保留計數以避免內存泄漏。
所以,作爲一個美眉,你可以像樹一樣思考記憶。假設你有一個父母(containerColor
)和一個孩子(currentColor
)。如果父(保留計數爲1)被釋放,它會導致爲其對象調用其dealloc方法和空閒內存。如果在其dealloc方法中釋放一個子項(保留計數爲1),它會導致調用其dealloc方法和空閒內存。如果孩子的保留數大於1,則會導致內存泄漏。
希望它有幫助。
編輯
對於你能讀懂About Memory Management進一步的信息。自iOS 5 Apple推出ARC以來,自動引用計數是一種編譯器機制,提供Objective-C對象的自動內存管理。有關信息,請參閱Transitioning to ARC Release Notes。
Hello Flex,非常感謝您的回答。 – karthick
不客氣! –