2012-08-08 26 views
3

我知道這似乎是一個非常基本的問題,但我一直認爲解釋(和理解)基本問題是構建乾淨和有效代碼的關鍵。在Xcode中運行「分析」我得到了著名的「潛在的空提領」創建錯誤時在處理NSError時理解'潛在的空解除引用'

-(BOOL)validateForInsert:(NSError *__autoreleasing *)error { 
    [super validateForInsert:error]; 
    return [self validateInternal:error]; 
} 

-(BOOL)validateInternal:(NSError *__autoreleasing *)error { 
    // checking attributes and build userInfo error 
    if(anyErrors) { 
    *error = [NSError errorWithDomain:appDomain code:200 userInfo:details]; 
    return NO; 
    } 
    return YES; 
} 

: 我的代碼在CoreData實體下面的代碼片段。雖然編譯器沒有提供任何警報,並且代碼一直工作。 這也可能是一個問題,爲什麼編譯器沒有提醒我這個問題?但是到代碼中,我完全知道這個解決方案,它是檢查(錯誤!=無),但是我在這方面很迷茫。 問題從一開始就在NSError * _autoreleasing *的意思,爲什麼周圍的明星?哪一個應該是一個指針指針?

假設我想調用validateForInsert:我自己如何構建* _autoreleasing *對象?

下面的問題,我想是與上面的問題有關:如果我從頭開始構建*錯誤,爲什麼我想檢查是否爲零?

最後但並非最不重要的是,代碼工作正常,錯誤被攔截,請問您能否發現可能導致錯誤或崩潰的案例?正如我所說我正在使用CoreData,一個通用的例子會很好,但另一個與CoreData有關的讚賞。

感謝

回答

3
*error = [NSError errorWithDomain:appDomain code:200 userInfo:details]; 

語法正確,因此編譯器不會發出警告。該分析儀檢測,這將在運行時,如果error = NULL崩潰,也就是說,如果你調用

[myObj validateForInsert:NULL]; 

如果你打電話

NSError *error; 
[myObj validateForInsert:&error]; 

那麼你傳遞的error地址,所以你通過NSError * *類型的變量。

__autoreleasing修飾符是向ARC編譯器提示分配給error的對象是自動釋放對象的提示。

可以聲明一個變量與

NSError * __autoreleasing error; 
[myObj validateForInsert:&error]; 

被自動釋放,但通常你不在乎。 ARC只是生成正確的代碼。

詳情請閱讀Transitioning to ARC Release Notes。關於這個話題在stackoverflow上也有很多答案。

+0

我完全錯過了autoreleasing的含義,我把它想成是一個變量名!感謝您的解釋,對我來說,標記爲答案已經足夠了。 – Leonardo 2012-08-17 12:17:28

+0

不客氣。 – 2012-08-17 12:22:55