我们知道在 Objective-C 中给 nil 发送消息程序不会崩溃,
Objective-C 是以 C 语言为基础的,
PC 上,在 C 语言中对空指针进行操作,
程序会由于越界访问而出现保护错进而崩溃,
但是 Objective-C 中为什么不会崩溃呢?
原因需要从源代码中寻找,
下面是 objc_msgSend 的 arm 版汇编代码片段:
在 arm 的函数调用过程中,
一般用 r0-r4 传递参数,
用 r0 传递返回值。
对应 objc_msgSend,第一个参数为 self,返回值也是 self,都放在 r0(a1)中。
/********************************************************************
* idobjc_msgSend(idself, SELop, ...)
* On entry: a1 is the message receiver,
* a2 is the selector
********************************************************************/
ENTRY objc_msgSend
# check whether receiver is nil
teq a1, #0
moveq a2, #0
bxeq lr
teq 指令说明: