iOS 论本质
对象的本质
创建一个工程,并且创建一个Man类,在main方法中初始化一个实例对象,就有这个一行代码 Man * m = [Man new];
然后在终端clang -rewrite-objc main.m -o mian.cpp
通过c++编译后在代码中,可以找到一句话typedef struct objc_object Man; 那么我们的Man 就是objc_object类型的结构体~~~那么我们所说的对象预计都是objc_object类型的结构体,objc_object如下
/// Represents an instance of a class.
struct objc_object {
Class_Nonnull isa OBJC_ISA_AVAILABILITY;
};
所以可以得出对象本身是一个带有指向其类别isa指针的结构体。
消息的本质
上文clang之后的c++编译后的代码中,还可以发现这部分
int main(intargc,constchar* argv[]) {
/* @autoreleasepool */{ __AtAutoreleasePool __autoreleasepool; Man *m = ((Man *(*)(id, SEL))(void*)objc_msgSend)((id)objc_getClass("Man"), sel_registerName("new")); ((void(*)(id, SEL))(void*)objc_msgSend)((id)m, sel_registerName("run")); }return0;}
调用了一个函数objc_msgSend,我们在断点调试ViewDidLoad的时候,发现能打印self,_cmd这就是我们的消息底层默认的两个参数id和SEL,前者是消息的接收者,后者是方法编号,可以通过SEL找到函数实现,底层是依赖一个IMP的函数指针,就是函数实现。