2011-09-30 88 views
0

僅僅因爲我將一個新的alloc init(ed)對象的引用傳遞給另一個類並不意味着該類將它保留在構造函數中,對吧?保留版本計數,需要確認

據我所知,爲了讓課程保留一些東西,它實際上需要發送retain消息給一個對象。它是否正確?

在我的例子中,我指的是我自己的自定義類,而不是Apple類。

回答

3

其他類應該保留它,如果它要參考它。但是,這是你所打電話課程的關注點。

是的,發送保留消息會保留它。

它來閱讀本指南是非常重要的:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

下面是一個很好的一套規則。第二條規則說你保留你存儲的東西,它也表示接收到的對象保證在該函數調用的生命週期中有效。這意味着如果你將一個對象當成一個arg並且你不想將它作爲一個iVar /屬性來存儲,那麼你不需要保留它。

linked Apple doc

你擁有的任何對象創建

您創建使用名稱以「黃金」, 「新」,「複製」對象的方法,或「mutableCopy」(例如,alloc,newObject或012able)。

您使用保留

一個接收的對象通常是保證該 方法接收它的內仍然有效可以採取的對象的所有權,並且該方法也可以安全的 對象返回到它的調用。在兩種情況下使用retain:(1)在訪問方法或init方法的 實現中,取 要存儲的對象的所有權作爲屬性值;和(2) 防止某個對象作爲某些其他操作的副作用而失效(如「避免導致您正在使用的對象取消分配 」中所述)。

當你不再需要它,你必須放棄一個 對象的所有權您擁有

您可以通過發送一個釋放消息 或自動釋放消息的放棄對象的所有權。在Cocoa術語中,放棄對象的所有權因此通常被稱爲「釋放」對象的 。

你一定不會放棄對象的所有權,你沒有自己的先前的策略規則

這只是推論,說 明確。

+0

謝謝先生。這有助於 – JAM

2

正確。保留必須編碼或不會發生。

+0

問題是如果你在一個構造函數中傳遞它,我猜是另一個類會保留這個對象,這個構造函數是'init'。 – Davyd

+0

除非構造函數有一個保留編碼在其中。 –

+0

當然,如果構造函數需要保留它的對象。但問題是「僅僅因爲我通過了一個參考......那個階級保留了?」。答案是不。當你將對象的引用傳遞給另一個對象的init方法時,它不一定會被保留。 – Davyd