Apple模板是否包含错误,因为它们会转换为BOOL?

Ste*_*ser 9 null cocoa cocoa-touch boolean objective-c

根据Mike Ash的博客文章,由于指针大于BOOL,因此转换为BOOL可能会失败6%的时间.因此,他建议如果你正在检查一个物体是否存在,你应该检查是否为零

if (self != nil) {
Run Code Online (Sandbox Code Playgroud)

而不是Apple模板的功能

if (self) {
Run Code Online (Sandbox Code Playgroud)

Apple的模板是否包含一个bug或者是否有其他一些我不知道的语法糖?

小智 12

因为他们投了BOOL

不,他们没有.根本没有表演.但是,将表达式评估为逻辑值.对于指针(指针nil和指针self),NULL指针的计算结果为false,其他任何指针都为true.这不是一个错误,只是一种速记方式,它完全有效C.

关于为什么人们可能想要对NULL或进行明确的比较nil:在某些情况下,它可能更具可读性,特别是如果乍看之下表达式的类型和范围并不明显.然而,在Objective-C和Cocoa中,构造函数中的这种常见习惯就是这样,任何有经验的程序员都会毫无问题地掌握它.


CRD*_*CRD 4

Objective-C 基于 C,并且在 C 中,该if语句确实不对布尔值进行操作,这也许令人惊讶。

C 有一个类型层次结构:

  • 、整数char和枚举 ( enum) 类型是整数类型
  • floatdouble真正的浮动long double类型
  • 存在三种复数类型,它们与实数浮点类型一起简称为浮点类型
  • 整数类型和浮点类型组合形成算术类型
  • 算术类型与指针类型一起形成标量类型

唷!

现在该if声明采用以下形式之一:

if ( expression ) statement
if ( expression ) statement else statement
Run Code Online (Sandbox Code Playgroud)

其中表达式必须是任何标量类型如果表达式比较不等于 0,则执行第一条(或唯一一条)语句,第二条语句(如果存在)语句;如果表达式比较等于 0,则执行第二个(如果存在)语句。

所以:

if (self) ...
Run Code Online (Sandbox Code Playgroud)

if (self != nil) ...
Run Code Online (Sandbox Code Playgroud)

结果相同

第一个表达式self是某种指针类型,它是标量类型,并比较是否不等于指针类型的零(在代码中表示为nil)。第二个表达式self != nil是一个等式表达式,并产生类型 的0or ,这也是标量类型1int...

因此,从技术上讲,第二种形式涉及值的中间生成int,但编译器实际上不会生成值(当然,除非您将表达式的结果分配给变量)。

笔记:

  1. 有点奇怪if ( sin( angle ) ) ...是有效的......
  2. switch语句对整数类型而不是标量类型进行操作

华泰