iOS runtime之类和对象

Posted xiaoxiaobukuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS runtime之类和对象相关的知识,希望对你有一定的参考价值。

  • 每个Class都有一个isa指针指向一个唯一的Meta Class
  • 每一个Meta Classisa 指针都指向Meta Class,即NSObjectMetaClass,而最上层的MetaClass的isa指针又指向自己。

一、对象、类对象、元类对象

1、类对象

类对象存储实例方法列表等信息

类对象是程序猿定义并在运行时由编译器创建的,它没有自己的实例变量,这里需要注意的是类的成员变量和实例方法是属于实例对象的,但其存储于类对象当中的。

2、实例对象

实例对象是我们对类对象alloc或者new操作时所创建的,在这个过程中会拷贝实例所属类的成员变量,但并不拷贝类定义的方法.调用实例方法时,系统会根据实例的isa指针去类的方法列表及父类的方法列表中寻找与消息对应的selector指向的方法。

3、元类对象

元类对象存储类方法列表等信息

元类对象即是描述类对象的类,每个类都有自己的元类,也就是结构体objc_classisa指向的类。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告诉编译器:属性的settergetter方法由用户自己实现,不自动生成(当然对于readonly的属性只需提供getter即可)

假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var = someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = instance.var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定

以上是关于iOS runtime之类和对象的主要内容,如果未能解决你的问题,请参考以下文章

RunTime之类与对象

IOS-Runtime(消息机制)

iOS RunTime运行时:类与对象

ios之runtime

iOS底层探索之Runtime:运行时&方法的本质

Objective-C Runtime的基本使用(iOS Runtime的初体验)