苹果官方文档是最正确的学习姿式html
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语言的一种操做系统;这就是语言的工做原理。bash
那么什么是运行时?什么叫编译时?app
编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.
(固然只是通常意义上这么说,实际上可能只是翻译成某个中间状态的语言) 那编译时就是简单的做一些翻译工做,好比检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的做文中有没有错别字和病句同样.若是发现啥错误编译器就告诉你.若是你用微软的VS的话,点下build.那就开始编译,若是下面有errors或者warning信息,那都是编译器检查出来的.所谓这时的错误就叫编译时错误,这个过程当中作的啥类型检查也就叫编译时类型检查,或静态类型检查(所谓静态嘛就是没把真把代码放内存中运行起来,而只是把代码看成文原本扫描下).因此有时一些人说编译时还分配内存啥的确定是错误的说法.ide
所谓运行时就是代码跑起来了.被装载到内存中去了.(你的代码保存在磁盘上没装入内存以前是个死家伙.只有跑到内存中才变成活的).而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不同.不是简单的扫描代码.而是在内存中作些操做,作些判断.函数
我如今就来测试 : 下面是一个LGPerson对象学习
LGPerson *p = [LGPerson new];
clang -rewrite-objc main.m -o mian.cpp
复制代码
由于咱们都知道OC底层是C,咱们进一步能够编译C++代码(重写)测试
经过C++编译 个人天啊. 9851
行代码吓我一哆嗦,不过不要紧.做为一名优秀iOS底层开发人员,谁没见过一万行代码
似的!何况不少我都不须要考虑,里面有不少结构体,都是一些引入,还有不少函数,也不是咱们关心的,咱们把文件拖到最下面ui
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
spa
#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
,表明这个匿名函数也是对象,也重复符合万物皆对象
的说法!!!