正如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];
謝謝,這是一個明確的解釋:D。 –
我不明白爲什麼代碼無法正常工作。我剛剛閱讀示例代碼,其中有:'SecondViewController * aSecondView = [[SecondViewController alloc] initWithNibName:@「SecondView」bundle:nil];'這不是一回事嗎?獲取臨時對象指針並初始化你想要的,然後設置一個從真實對象到啓動的東西的指針。最後釋放臨時對象指針。 [self setSecondViewController:aSecondView]; [aSecondView發佈]; –
在這種情況下,'setSecondViewController:'將保留'aSecondView'(如果內部實現細節認爲它是必要的 - 很可能它保留,它可能會做其他事情)。 – bbum