比方說,我做了以下(富開始爲一些對象):釋放和保留
[foo release];
// STUFF with foo
[foo retain];
只要我不是重新分配FOO,在此我還是有結束同樣的富,對嗎?我是不是冒着失去foo的風險去冒險?
我想我確定我對版本的理解是正確的。如果我釋放foo,它不會消失,直到它上的所有句柄都消失。換句話說,foo必須被分配給// STUFF中的某個其他對象,否則foo必須超出// STUFF的範圍(並且可能會創建一個新的foo),以便實際使用原始foo要刪除的對象,對嗎?
編輯動機:
我想這樣做是可以說我有以下switch語句的原因:
switch (test)
{
case 1:
foo = [A alloc];
[foo inita];
break;
case 2:
foo = [B alloc];
[foo initb];
break;
case 3:
[foo setupc];
break;
case 4:
f = [D alloc];
[foo initd];
break;
}
這是有道理的開關之前釋放foo和在保留它然後結束。情況3除外。所以,我在想,如果按照我的建議安全地做,可能會使代碼變得更簡單。
當然我可以只放了釋放/保留圍繞每個分配/初始化對,但是這是一個很大的重複代碼...
A [富自動釋放],然後保留可能只是做的伎倆。
如果您在這裏提供更多的上下文,這將有所幫助。 foo是一個實例變量,並且假設foo已經在交換機之前包含了一個對象? (否則,爲什麼你需要調用-release?)另外,alloc返回一個保留計數爲1的實例。爲什麼你需要額外的電話保留?我完全不清楚你在這裏做什麼。 – jlehr 2010-03-05 22:31:53
測試的性質是什麼?根據答案,可能會用多態行爲替換交換機。 – outis 2010-03-05 22:44:05
@JLehr,test是一個基於mimetype的int。不同的類型是不同類型的文檔... foo是一個實例變量,它可能已經包含一個對象。 (因此釋放)在情況3的實際代碼中,「if(foo == nil)foo = [C alloc];」在情況3 ...我不確定我是否需要保留。我想我的問題比我想象的要大...... – 2010-03-05 22:49:34