【iOS Sharing】【1】isa相关
本文最后更新于:2021年12月22日 上午
【iOS笔记】系列目录
目录
1、Runtime存在的意义是什么?
2、根元类的isa指针指向谁?
3、根元类的superClass指针指向谁?
4、isa指针有几种类型?
5、id、self、super 它们从语法上有什么区别?
1、Runtime存在的意义是什么?
答:Objective-C 是一门动态语言,它会将一些工作放在代码运行时才处理而并非编译时。也就是说,有很多类和成员变量在我们编译的时是不知道的,而在运行时,我们所编写的代码会转换成完整的确定的代码运行。因此,只有编译器是不够的,我们还需要一个运行时系统(Runtime system)来处理编译后的代码。 这就是 Objective-C Runtime 系统存在的意义,它是整个Objc运行框架的一块基石。平时编写的OC代码,底层都是由他实现的,如:
1 |
|
2、根元类的isa指针指向谁?
答: 见下一问3、根元类的superClass指针指向谁?
答:这两题一起回答。首先看下图:先说几个概念:
- (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路线:
- 实例对象没有superclass ;
- 实例对象所在的类,存在superclass,类的superclass后面会指向Root Class,Root Class的super Class是nil;
- 元类也存在superclass,元类的superclass后面会指向Root Meta Class,而Root Meta Class的superclass却是Root Class。
- 实例对象没有superclass ;
所以:
- 根元类的isa指针指向自己
- 根元类的superclass指向root class
- 根类的isa指向根元类
- 根类的superclass指向nil
附旧版Class结构:
1 |
|
1 |
|
Class是一个指向objc_class(类)结构体的指针,而id是一个指向objc_object(对象)结构体的指针。
objec_object(对象)中isa指针指向的类结构称为objec_class(该对象的类),其中存放着普通成员变量与对象方法 (“-”开头的方法)。
objec_class(类)中isa指针指向的类结构称为metaclass(该类的元类),其中存放着static类型的成员变量与static类型的方法 (“+”开头的方法)。
objc-old
新版Class
4、isa指针有几种类型?
答: isa指针分,指针类型和非指针类型,32位只做地址保存,非嵌入式64位架构下,包含除类地址外的其他信息。5、id、self、super 它们从语法上有什么区别?
- id 可作为方法的返回值类型、参数类型,以及变量的类型
- self 可以用来调用方法,在实例方法中代表当前类的实例,在类方法中代表当前类,多态的一个对象, 它只能作为参数传递,不能作为类型使用,另外它也是消息发送过程中第一个默认参数
- super 为编译器的一个关键字,告知编译器在调用方法时从父类的方法表中寻找
联系方式
邮箱: adrenine@163.com
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!