Objective-C相当的与众不同,因为对
nil发送消息不会发生任何事情,而是简单的返回0。基本上,在你可能遇到的每种语言中,同样的事情要么被类型系统禁止,要么就是产生一个运行时错误。这既是优点也是缺点。鉴于这个文章的主题,我们来关注下缺点。
首先,我们看一个等同性的测试:
[nil isEqual: @"string"]
给
nil发送消息总是返回0,在这儿就相当于
NO。这次恰好是正确的答案,所以看起来我们有个不错的开头!但是,看看这个:
[nil isEqual: nil]
这个也是返回
NO。即使参数是完全相同的值也无关紧要。参数的值到底是什么根本不重要,因为给nil发送消息不管怎样总是返回0。所以用
isEqual:来判断,nil永远不会等同于任何东西,包括它自身。大多情况下这是正确的,但不总是。
最后,再考虑和
nil比较的另一种顺序:
[@"string" isEqual: nil]
这个会怎样呢?好吧,我们无法确定。它有可能返回
NO,也有可能会抛出异常,还有可能干脆崩溃。给一个没有明确告知可以接受nil为参数的方法传递nil是一个坏注意。并且,isEqual:并没有表明它可以接受nil。