Objective-C的方法调用:消息机制,给方法调用者发送消息

Objective-C的方法的调用,其实都是转换成objc_msgSend函数的调用

DXPerson *person = [[DXPerson alloc] init];
[person personTest];

转换成C++代码,查看底层实现

((void (*)(id, SEL))(void *)objc_msgSend)((id)person,
sel_registerName("personTest"));
// 去掉强制转换类型的代码后
objc_msgSend(person, sel_registerName(personTest));

// sel_registerName(personTest) == @selector(personTest)

类方法一样,例如

[DXPerson initialize];

转换成C++代码

((void (*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("DXPerson"),
sel_registerName("initialize"));
// 去掉强制转换类型的代码后
objc_msgSend(objc_getClass("DXPerson"), sel_registerName("initialize"));
// [DXPerson class] == objc_getClass("DXPerson")

为什么给nil发消息不会崩溃?

通过objc_msgSend源码解读(汇编代码),第一步就是判断receiver1是不是为空

// 伪代码
void objc_msgSend(id receiver, SEL selector){
    if (receiver == nil) {
        return ;
    }
}