iOS底层原理iOS 进阶开发

iOS底层-对象的本质

2018-11-29  本文已影响56人  Cooci_和谐学习_不急不躁

苹果官方文档是最正确的学习姿势

The Objective-C language defers as many decisions as it can from compile time and link time to runtime. Whenever possible, it does things dynamically. This means that the language requires not just a compiler, but also a runtime system to execute the compiled code. The runtime system acts as a kind of operating system for the Objective-C language; it’s what makes the language work.
Objective-C语言尽可能多地推迟从编译时链接时运行时的决策。只要有可能,它就会动态地执行操作。这意味着该语言不仅需要编译器,还需要运行时系统来执行编译后的代码。运行时系统作为Objective-C语言的一种操作系统;这就是语言的工作原理。

图片.png

首先今天写这篇博客是对学习的记录

那么什么是运行时?什么叫编译时?

对象的本质

我现在就来测试 : 下面是一个LGPerson对象

LGPerson *p = [LGPerson new];
clang -rewrite-objc main.m -o mian.cpp

因为我们都知道OC底层是C,我们进一步可以编译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;
};

我们的NSObjectisaobjc_object结构体重的属性在我们实现NSObject的时候只是对isa的重写~~~isa也是我们后面后面学习非常重要的路线.比如我们编译block也能看到isa,代表这个匿名函数也是对象,也重复符合万物皆对象的说法!!!

上一篇 下一篇

猜你喜欢

热点阅读