有些情况下可能你会发现 BOOL 类型可以赋值为 nil,但在我们的印象里,nil 是 OC 对象的字面空白值,那么为什么可以赋值给 BOOL 呢?

首先我们应该查阅苹果的官方文档,先来看看 BOOL 的定义:

typedef signed char BOOL;

我们知道 BOOL 有两个值,分别是 YESNO:

#define YES (BOOL)1
#define NO  (BOOL)0

可见, BOOL 事实上是有符号字符的别名,使用了 #define 分别定义了 1YES0NO

再看看 nil 是如何定义的:

#define nil __DARWIN_NULL

那么这个 __DARWIN_NULL 又是什么呢:

#define __DARWIN_NULL ((void *)0)

是不是明白了什么?