iOS底层-对象的本质
2015 年 12 月 20 日
我现在就来测试 : 下面是一个LGPerson对象
LGPerson *p = [LGPerson new]; clang -rewrite-objc main.m -o mian.cpp 复制代码
因为我们都知道OC底层是C,我们进一步可以编译C++代码(重写)

通过C++编译 我的天啊. 9851
行代码吓我一哆嗦,不过没关系.作为一名优秀iOS底层开发人员,谁没见过 一万行代码
似的!况且很多我都不需要考虑,里面有很多结构体,都是一些引入,还有很多函数,也不是我们关心的,我们把文件拖到最下面
int main(int argc, const char * argv[]) { /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; LGPerson *p = ((LGPerson *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("LGPerson"), sel_registerName("new")); LGStudent*s = ((LGStudent *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("LGStudent"), sel_registerName("new")); ((void (*)(id, SEL))(void *)objc_msgSend)((id)p, sel_registerName("run")); ((void (*)(id, SEL))(void *)objc_msgSend)((id)s, sel_registerName("walk")); } return 0; } 复制代码
这就有点熟悉了,这不是我们 main
函数的编译? 然后先不管下面的方法调用的编译,我们全局查找 LGPerson
#ifndef _REWRITER_typedef_LGPerson #define _REWRITER_typedef_LGPerson typedef struct objc_object LGPerson; typedef struct {} _objc_exc_LGPerson; #endif struct LGPerson_IMPL { struct NSObject_IMPL NSObject_IVARS; }; 复制代码
很明显的一句话 typedef struct objc_object LGPerson;
那么我们的 LGPerson
就是 objc_object类型的结构体
~~~那么我们所说的对象预计都是 objc_object类型的结构体
!我们带着好奇心继续查看 objc_object
struct objc_object { Class _Nonnull isa __attribute__((deprecated)); }; 复制代码
非常熟悉的身形 isa
这个时候我就想到了另外一个东西 NSObject
typedef struct objc_object NSObject; struct NSObject_IMPL { Class isa; }; 复制代码
我们的 NSObject
的 isa
是 objc_object
结构体重的属性在我们实现 NSObject
的时候只是对 isa
的重写~~~ isa
也是我们后面后面学习非常重要的路线.比如我们编译 block
也能看到 isa
,代表这个匿名函数也是对象,也重复符合 万物皆对象
的说法!!!
