iOS 论本质

2019-03-12  本文已影响0人  Code_Bee

对象的本质

创建一个工程,并且创建一个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的函数指针,就是函数实现。

上一篇下一篇

猜你喜欢

热点阅读