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方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxiaobukuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值