是一名Cocoa/Obj-C新手我正在瀏覽Aaron Hillegass的「Cocoa Programming for Mac OS X」一書,以及 - 現在我們還有機會使用GC來避免所有這些推理 - 我不確定我是否可以找到其中一些保留的原因。另一個「保留,然後釋放」的問題
尤其是在的例子亞倫給出良好的編程習慣之一:
- (void) setFoo:(NSCalendarDate *)x
{
[x retain];
[foo release];
foo = x;
}
我不明白的原因,在方法的第一行保留X實例:
[x retain];
這個實例的範圍只是set方法,對吧? 退出方法範圍時,x實例應該被釋放嗎? 此外,分配X時,與富貴:
foo = x;
富無論如何都會被指向X存儲器單元,因此將增加尖銳的物體保留計數,不是嗎?這應該確保內存不會被釋放。
那麼,有什麼意義呢?我相信我錯過了一些東西,當然,但不知道究竟是什麼。
感謝, 法布里奇奧
在附註中,這裏的代碼實際上突出了一個很好的練習。在某些情況下,'x'和'foo'可能已經指向同一個對象。在這種情況下,如果遵循'[foo release]'的典型設置流程,那麼foo = [x retain]',那麼您先釋放'x'/'foo',然後再保留它。如果在調用'setFoo:'時對象的保留計數爲'1',那麼它意味着'x'/'foo'首先被處理,然後被處理的對象被傳遞'retain'消息。繼Aaron的流程之後,在釋放'foo'之前先保留'x',避免了這個問題。 – 2011-06-22 07:15:01