3

我知道我想使用:INIT]在自動引用計數

ObjectClass *tmpObject = [[ObjectClass alloc] init]; 
realObject = tmpObject; 
[tmpObject release] 

初始化realObject(其中realObject是一個類中的對象)

但是現在與ARC模式,釋放是自動,我仍然需要使用這種技術? 我可以簡單地使用realObject = [[ObjectClass alloc] init];嗎? 如果不是,有什麼具體原因會泄漏?

感謝

回答

16

正如Spencer所說,如果您在啓用ARC的情況下編譯,您根本不能調用release。這樣做是錯誤的,編譯器會爲您處理它。

然而:

ObjectClass *tmpObject = [[ObjectClass alloc] init]; 
realObject = tmpObject; 
[tmpObject release] 

在這種情況下的tmpObject對於兩個ARC和手動保持釋放完全沒有意義的。事實上,在手動保留釋放中,上面的代碼將立即釋放分配的對象,導致它被釋放(除非ObjectClass內部做一些奇怪的事情),而realObject將留下一個懸掛指針。

I.e.正如所寫的那樣,如果任何人第一次嘗試向消息realObject發送消息,將會導致崩潰。

澄清:

ObjectClass *tmpObject = [[ObjectClass alloc] init]; 
// tmpObject now contains a reference to an instance of ObjectClass; say, 0x12340 
realObject = tmpObject; 
// realObject now contains a reference to that same instance; realObject == 0x12340 
[tmpObject release] 
// this releases the object 
// both tmpObject and realObject now reference a deallocated object; much hilarity ensues.  

對於ARC,你只是這樣做:

realObject = [[ObjectClass alloc] init]; 
+0

謝謝,這是一個明確的解釋:D。 –

+0

我不明白爲什麼代碼無法正常工作。我剛剛閱讀示例代碼,其中有:'SecondViewController * aSecondView = [[SecondViewController alloc] initWithNibName:@「SecondView」bundle:nil];'這不是一回事嗎?獲取臨時對象指針並初始化你想要的,然後設置一個從真實對象到啓動的東西的指針。最後釋放臨時對象指針。 [self setSecondViewController:aSecondView]; [aSecondView發佈]; –

+0

在這種情況下,'setSecondViewController:'將保留'aSecondView'(如果內部實現細節認爲它是必要的 - 很可能它保留,它可能會做其他事情)。 – bbum

4

如果您正在使用-fobjc弧編譯(即使用ARC),那麼你不僅不需要調用release,它是一個編譯錯誤,如果你這樣做。使用ARC時,編譯器的工作是爲您插入retainrelease調用。

+0

所以它創建對象的方法是正確的(或更好)?我應該改變我所有的「realObject = [[ObjectClass alloc] init];」? –

+0

對象創建保持不變,IIRC。 – Wevah

+0

是 - 對象創建保持不變,代碼中沒有任何保留/釋放。但問題在於,Tim的代碼首先被破壞了。 – bbum