2

抱歉,如果有人问过这样的问题,但我认为我理解布尔值,这让我感到困惑。在命令行 obj-c 程序中,BigNerdRanch 书说主函数返回 0,在布尔值中表示 false,这是一件好事,因为如果它返回 true 或 1,则意味着发生了错误。

所以本书后面的这段代码让我感到困惑。

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


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

return (todoItems != nil);

这段代码基本上不会说,由于 todoItems 将加载数据,因此它的指针不会设置为 nil,因此它将评估 true 作为方法的 BOOL 值返回 true,这意味着存在错误?我对此感到很困惑。

4

3 回答 3

3

不要将返回 BOOL 的方法的语义与main返回int.

在 C 中,许多函数返回一个int值,指示成功或失败。0通常意味着成功,而非零(不仅仅是1)是某种错误代码。代码几乎可以是任何非零数字。这只是自 70 年代以来一直使用的惯例。

当您编写返回 a 的方法时BOOL,您不会处理错误代码。要么YES要么NONO通常意味着它失败,而YES意味着它成功。

事实上,该值NO实际上与用于指示成功0的旧标准 C 约定完全无关。0不要混淆它们的含义。

阅读一个BOOL值的使用就像阅读一个句子。

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

像它看起来的那样读这个。成功的价值YES意味着它工作并且阅读代码是有意义的。

于 2013-08-02T02:40:30.333 回答
0

return (todoItems != nil);基本上意味着如果todoItemsnil,则表达式被评估为return false;,如果todoItems不是nil,那么它将是return true;

将其视为一个紧凑的 if 语句。

编辑:对不起,我误解了你的问题。但我实际上认为这本书的作者试图给你一个例子,说明如何使用返回值来指示错误。loadfunction 可能nil在出现错误时返回,因此程序会以 退出return true,这是一个错误。

于 2013-08-02T02:33:08.810 回答
0

实际上,按照惯例,返回零的 main() 函数确实意味着程序已经干净地退出了。如果出现错误,您将从 main() 返回非零值。这些错误值可能具有特定于程序的含义,也可能是标准 POSIX 错误值。

对于返回 BOOL 值的其他函数,由实现者来指示 YES 表示成功还是失败(或 NO 表示相反)。在这种情况下 -readFromData:ofType:error: 如果有一组非零数据,则返回 YES。我没有这本书,但我认为这意味着 YES 旨在映射到成功,而 NO 映射到失败。

换句话说,main() 返回值的约定不一定与返回 BOOL 的函数的返回值约定相关,因为后者没有约定。

于 2013-08-02T02:45:41.860 回答