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)
- 消息接收者(receiver):person
- 消息名称: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 ;
}
}