2009-10-29 96 views
7

有許多Cocoa方法需要一個NSError對象作爲方法的參數,但如果存在錯誤,它實際上是一種將錯誤對象返回給調用方法的方法。這個返回的對象是否保留?也就是說,在調用對象的代碼(返回到錯誤的方法),也有需要是一些代碼,如:我是否需要釋放一個返回的NSError對象?

NSError *error; 
    [apiCall .... error:&error]; 

    if (error){ 
    [*error release]; 
} 

我還沒有看到任何地方這樣,如果確實需要發佈,這是做到這一點的方式?

回答

7

返回的對象通常是自動發佈的。如果您之前在同一個對象上調用copy/alloc/retain,則通常只需撥打auto-/release。你不會提領error在方法調用:

// right 
[error code] 
// wrong 
[*error code] 
+0

我把[*錯誤代碼]的原因是,你也可以指定NSError var爲:NSError **錯誤;這是指向對象的一點。這有效嗎? – casademora 2009-10-29 03:28:56

+0

只有當它是「輸出參數」或「輸出參數」時,才指定'NSError **'作爲'error'類型。在這種情況下,您會解除引用,但請注意'* error'將會有'NSError *'類型。您可以使用參數來解決功能只有一個返回值的事實。 Objc-C中的Out參數使用'Type **',因爲參數是按值傳遞的。還要注意的是,如果'error'的類型爲'NSError **',你必須用一個指向'NSError *'的指針(這是你在API調用中做的)或者分配一個指針來進行初始化,但有點奇怪。 – outis 2009-10-29 05:01:29

+0

@outis如果它是自動發佈的,則不會在調用方法中使用它不正確。因爲實際創建NSError *並將其分配給out參數NSError **的方法的作用域已經在方法調用中完成,我們在調用方之後使用它。 – SayeedHussain 2013-08-22 10:12:30

4

您沒有爲錯誤分配的內存,所以你不需要將其釋放。通常,框架通常會向其創建的任何對象添加autorelease。

6

閱讀developer.apple.com上的內存規則 永遠不要相信任何重述它們的人,比如「你之前稱之爲copy/alloc/retain」 - 這不是規則,它實際上表示了類似'你通過方法與副本,新的或分配作爲名稱的一部分'。再次,不要相信我,請閱讀developer.apple.com

至於NSError * *,那就錯了。該方法接受一個NSError * *作爲它的參數,這是一個指向NSError *的指針。其指向NSError *的指針將填充來​​自的某個NSError的地址,該地址爲,並且您無權假定位置。

您只能傳遞指向NSError的指針* - 其他任何錯誤。

也不應該假定NSError是自動發佈的。它可能是單身人士,也可能是任意數量的候補人選。所有你需要知道的是'你沒有保留它,你不需要釋放它'。

+0

所有權政策(http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership。html#// apple_ref/doc/uid/20000043-SW1)是使用copy/alloc/new的方法隱含所有權(並保留顯式聲明所有權),這決定了誰發送釋放消息。 – outis 2009-10-29 05:35:33

+0

第三方不需要遵循此策略,但Apple建議在返回之前自動釋放已創建的NSError(http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError .html#// apple_ref/doc/uid/TP40001806-CH204-SW5) – outis 2009-10-29 05:36:10

+0

因此「通常自動發佈」和「一般規則」。 – outis 2009-10-29 05:37:42

相關問題