iOS runtime之类和对象
Posted xiaoxiaobukuang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS runtime之类和对象相关的知识,希望对你有一定的参考价值。
- 每个
Class
都有一个isa
指针指向一个唯一的Meta Class
- 每一个
Meta Class
的isa
指针都指向Meta Class
,即NSObject
的MetaClass
,而最上层的MetaClass
的isa指针又指向自己。
一、对象、类对象、元类对象
1、类对象
类对象存储实例方法列表等信息
类对象是程序猿定义并在运行时由编译器创建的,它没有自己的实例变量,这里需要注意的是类的成员变量和实例方法是属于实例对象的,但其存储于类对象当中的。
2、实例对象
实例对象是我们对类对象alloc
或者new
操作时所创建的,在这个过程中会拷贝实例所属类的成员变量,但并不拷贝类定义的方法.调用实例方法时,系统会根据实例的isa
指针去类的方法列表及父类的方法列表中寻找与消息对应的selector
指向的方法。
3、元类对象
元类对象存储类方法列表等信息
元类对象即是描述类对象的类,每个类都有自己的元类,也就是结构体objc_class
中isa
指向的类。Objective_C
的类方法是使用元类的根本原因,其中存储着对应的类对象调用的方法即类方法。
二、super /superClass/class
1、super
仅仅是一个编译指示器,为编辑器关键之,就是给编译器看的,不是一个指针。
本质:只要编译器看到super
这个标志,就会让当前对象去调用父类方法,本质还是当前对象在调用。
2、class
获取当前方法的调用者的类;
3、superClass
获取当前方法的调用者的父类;
#import "Person.h"
@implementation Person
- (void)test
NSLog(@"%@,%@,%@,%@",[self class],[self superclass],[super class], [super superclass]);
打印结果 //Person,NSObject,Person,NSObject
@end
三、runtime的应用
1、动态创建方法
2、Method Swizzling
3、动态方法解析
- 动态运行时语言将函数决议推迟到运行时;
- 编译时语言在编译期进行函数决议;
@property
有两个对应的词,一个是@synthesize
,一个是@dynamic
。如果@synthesize
和@dynamic
都没写,那么默认的就是@syntheszie var = _var;
@synthesize
的语义是如果你没有手动实现setter
方法和getter
方法,那么编译器会自动为你加上这两个方法- @
dynamic
告诉编译器:属性的setter
与getter
方法由用户自己实现,不自动生成(当然对于readonly
的属性只需提供getter
即可)
假如一个属性被声明为@dynamic var
,然后你没有提供@setter
方法和@getter
方法,编译的时候没问题,但是当程序运行到instance.var = someVar
,由于缺setter
方法会导致程序崩溃;或者当运行到 someVar = instance.var
时,由于缺getter
方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定
以上是关于iOS runtime之类和对象的主要内容,如果未能解决你的问题,请参考以下文章