专栏名称: Adrenine
iOS开发
目录
相关文章推荐
51好读  ›  专栏  ›  Adrenine

iOS Weekly #01 | 2019-03-23

Adrenine  · 掘金  ·  · 2019-03-23 10:07

正文

阅读 45

iOS Weekly #01 | 2019-03-23

目录

1、Runtime存在的意义是什么?

2、根源类的isa指针指向谁?

3、根元类的superClass指针指向谁?

4、函数四要素都是什么?

5、实例方法去哪里找?


Runtime存在的意义是什么

答:Objective-C 是一门动态语言,它会将一些工作放在代码运行时才处理而并非编译时。也就是说,有很多类和成员变量在我们编译的时是不知道的,而在运行时,我们所编写的代码会转换成完整的确定的代码运行。因此,只有编译器是不够的,我们还需要一个运行时系统(Runtime system)来处理编译后的代码。 这就是 Objective-C Runtime 系统存在的意义,它是整个Objc运行框架的一块基石。

平时编写的OC代码,底层都是由他实现的,如:

[receiver message];
//底层运行时会被编译器转化为:
objc_msgSend(receiver, selector)
//如果其还有参数比如:
[receiver message:(id)arg...];
//底层运行时会被编译器转化为:
objc_msgSend(receiver, selector, arg1, arg2, ...)

复制代码

根元类的isa指针指向谁

答: 见下一问


根元类的superClass指针指向谁

答:这两题一起回答。首先看下图:

nsobject

先说几个概念:
1)supercalss : 父类
2)subclass: 子类
3)isa : 概念不好说,官方文档说的也不清晰。作用是根据 isa 指针就可以找到对象所属的类,但是isa指针在代码运行时并不总指向实例对象所属的类型,所以不能依靠它来确定类型,要想确定类型还是需要用对象的 -class 方法。(PS:KVO 的实现机理就是将被观察对象的isa指针指向一个中间类而不是真实类型。)
4)class : 类,一个运行时类中关联了它的父类指针、类名、成员变量、方法、缓存以及附属的协议。(一个实例对象是一个类的实例)
5)meta class :元类,Objc 类本身也是一个对象 ,类对象所属的类就叫做元类(一个类是元类的实例)

第一列是类的实例变量,如:[Person new]或者[[Person alloc] init]出来的对象;
第二列是类本身,存放父类指针、类名、成员变量、方法、缓存以及附属的协议的信息;
第三列是元类

1):isa路线:
实例对象的isa指向Class,Class的isa指向Meta Class,Meta Class的isa指向根元类Root Meta Class,根元类的isa指向自己
2):superclass路线:
a)、实例对象没有superclass ;
b)、实例对象所在的类,存在superclass,类的superclass后面会指向Root Class,Root Class的super Class是nil;







请到「今天看啥」查看全文