Objective-C基础:BOOL值的不同
布尔值
宏定义 真为YES 假为NO
Objective-C中的BOOL实际上是一种对带符号的字符类型(signed char)的定义(typedef),它使用8位存储空间,YES定义为1,而NO定义为0(使用#define)。
Objective-C并不将BOOL作为仅能保存YES或NO值的真正的布尔类型来处理。编译器将BOOL认作8位二进制数,YES和NO值只是一种约定。
这引发了一个小问题:如果不小心将一个长于1字节的整型值(例如short或int值)赋给一个BOOL变量,那么只有低位字节会用作BOOL值。
假设该低位字节刚好为0(例如8960,写成十六进制0x2300),BOOL值将会是0,即NO值。
在其大多数历史阶段,C都缺乏一个定义的布尔类型。它通过计算表达式来确定真值。如果一个表达式计算为0,则被认为是假;相反,则为真。
C99标准添加了一个布尔类型,bool,并且还添加了真值true和假值false。Objective-C有自己的布尔类型,BOOL,并且还有真值常量YES和假值常量NO。
BOOL不是一个基本类型。它是无符号的char的一个typedef(别名)。YES和NO只是为1和0定义的常量。
由于Objective-C继承了所有的C类型,因此我们可以在自己的Objective-C程序中使用bool类型。
然而,Cocoa框架和大多数已有的Objective-C代码使用BOOL。尽管可以在bool和BOOL之间相互转换,除非你的程序用到的库使用了bool,否则干脆忘掉bool会更容易一些。
注意 尽管Objective-C当前的版本是基于C99标准的,但Objective-C最初只是作为缺乏布尔类型的一个较早版本的C的扩展而开发的。
尽管C99的bool类型也可以使用,但大多数Objective-C社群使用Objective-C的BOOL。
SEL
SEL是保存了一个Objective-C方法名表示的一种类型。SEL是selector的缩写。方法名有时候叫做选择器,因为运行时使用它们来选择要执行的代码,以响应一条消息。
IMP
IMP是一个typedef,用于“一个指针,它指向接受参数id、SEL及可能的其他参数并且返回id的函数”。

浙公网安备 33010602011771号