2013-08-02 72 views
2

對不起,如果這樣的事情已經被問到,但我認爲我理解布爾值,這讓我感到困惑。在一個命令行obj-c程序中,BigNerdRanch書中說主函數返回0,它在布爾中表示爲false,這是一件好事,因爲如果返回true或1,則意味着發生了錯誤。BOOL評估Objective-C

所以這段代碼後來在這本書中讓我感到困惑。

-(BOOL)readFromData (NSData *)data ofType:(NSString *)typeName error(NSError **)outError 


todoItems = [NSPropertyListSerialization propertyListWithData: data 
options:NSPropertyListMutableContainers 
format:NULL 
error:outError 

return (todoItems != nil); 

不會驗證碼說基本上是因爲todoItems將被加載數據是指針將不會被設置爲零,因此它會評估真這將是方法意義BOOL值返回true有一個錯誤?我很困惑。

回答

3

不要混淆返回BOOL的方法的語義與main函數返回int

在C中,許多函數返回指示成功或失敗的int值。 0通常表示成功,而非零(不僅僅是1)是某種錯誤代碼。該代碼可以是任何非零數字。這只是70年代以來一直使用的慣例。

當你編寫一個返回BOOL的方法時,你沒有處理錯誤代碼。它可以是YESNONO通常表示失敗,而YES表示成功。

NO確實爲0的事實與使用0的舊標準C慣例沒有任何關係,表示成功。不要混淆他們的意思。

閱讀BOOL值的用法,如閱讀一個句子。

if ([someClass readFromData...]) { 
} 

閱讀它看起來很像它。 YES的成功值意味着它的工作,並閱讀代碼是有道理的。

0

return (todoItems != nil);基本上意味着,如果todoItemsnil,則表達式被評估以return false;並且如果todoItemsnil,那麼這將是return true;

想一想爲緊湊if語句。

編輯:對不起,我誤解你的問題。但我實際上認爲本書的作者正試圖給你一個如何使用返回值來指示錯誤的例子。出現錯誤時,加載函數可能返回nil,因此程序將退出return true,這是一個錯誤。

0

返回零的main()函數確實按慣例表示程序已經完全退出。如果有錯誤,您將返回main()的非零值。這些錯誤值可能具有程序特定的含義,或者可能是標準的POSIX錯誤值。

對於返回BOOL值的其他函數,由實現者指出YES是指成功還是失敗(否則爲NO)。在這種情況下-readFromData:ofType:error:如果存在非零組數據,則返回YES。我沒有這本書,但我認爲這意味着YES意味着被映射到成功,NO被映射到失敗。

換句話說,main()返回值的約定不一定與返回BOOL的函數返回值的約定相關,因爲後者沒有約定。