2011-08-16 56 views
0

XCode分析儀告訴我在第4行有一個問題 - return [originalError copy]; - 但我沒有看到它。請幫幫我?這段代碼的內存管理問題是什麼?

- (NSError *)errorFromOriginalError:(NSError *)originalError error:(NSError *)secondError 
{ 
    if (secondError == nil) { 
     return [originalError copy]; 
    } 
    // ... 
} 

問題描述如下:

  • 上線分配的物體的潛在的泄漏203
    • 方法返回一個Objective-C對象與1保留計數(擁有參考)
    • 返回給調用者的對象作爲擁有參考(單個保留計數轉移給調用者)
    • 線203上分配的對象從方法w返回軟管名稱('errorFromOriginalError:error:')不包含'copy'或以'new'或'alloc'開頭。這違反了Cocoa存儲管理指南中給出的命名約定規則(對象泄露)
  • 可能的空解除引用。根據「創建和返回NSError對象」中的編碼標準,參數'錯誤'可能爲空

第三個問題似乎表明我應該更改名稱或方法的行爲。對此有何建議?該方法源自Apple's Core Data Validation document中描述的errorFromOriginalError:error:方法。其目的是結合originalErrorsecondError,以便secondErrororiginalError的子錯誤。

我的補充嘗試確保該方法仍然有效,如果沒有實際的secondError。由於如果secondError不是nil就會創建一個新的錯誤對象,我想通過簡單地複製錯誤對象來重新創建上述情況。

回答

2

您正在originalError的副本,但功能顧名思義返回的對象會被自動釋放。試試

return [[originalError copy] autorelease]; 
+0

謝謝,這確實解決了問題,除了最後一個(潛在的空解除引用)。我如何擺脫那個?我嘗試添加'if(originalError == nil) return nil;'在方法開始時,但無濟於事。 – winsmith

+0

看到這個答案:http://stackoverflow.com/questions/1189518/clang-error-on-potential-null-dereference/1189570#1189570 – jrturton

+0

Merci。 (我想知道是否不贊成在SO上添加「謝謝」意見,我認爲這很有禮貌,但社區是怎麼想的?) – winsmith

1

[originalError copy]創建一個保留計數設置爲1的新對象。然後調用方法將該對象的責任稱爲release。如果你這樣做,那麼它不一定是一個問題,但它可能是一個更好的想法autorelease它。

return [[originalError copy] autorelease]; 
+0

謝謝你的回答;它跟Jrturton一樣正確。我希望你不要介意我說他是正確的,因爲他稍微快點回答。 – winsmith