你的位置:首页 > 软件开发 > 操作系统 > iOS开发日记17

iOS开发日记17

发布时间:2015-09-11 17:00:27
今天博主有一个runtime基础的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步.Objective-C runtime是一个运行时库,主要是由C语言和汇编语言写成,为C语言添加面向对象的能力而创造了Objective-C。这意味着它可以加载类信息,进行方法派发以及方法 ...

iOS开发日记17

今天博主有一个runtime基础的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步.

Objective-C runtime是一个运行时库,主要是由C语言和汇编语言写成,为C语言添加面向对象的能力而创造了Objective-C。这意味着它可以加载类信息,进行方法派发以及方法转发等等。Objective-C 运行时最重要的就是为Objective-C语言的面向对象特性的实现提供了所有的基础支撑.

 

那么,runtime具体究竟是什么呢?相信各位看官百度了很多文章后,发现十篇有九篇都看不懂,这时因为有很多基础的东西我们并不了解,今天博主就和大家分享一下,runtime基础篇

我们写的代码在程序运行过程中都会被转化成runtime的C代码执行,例如[xxxxxx doSomething];会被转化成objc_msgSend(xxxxxx, @selector(doSomething));

OC中一切都被设计成了对象,我们都知道一个类被初始化成一个实例,这个实例是一个对象。实际上一个类本质上也是一个对象,在runtime中用结构体表示。

 

相关的定义:

/// 描述类中的一个方法typedef struct objc_method *Method;/// 实例变量typedef struct objc_ivar *Ivar;/// 类别Categorytypedef struct objc_category *Category;/// 类中声明的属性typedef struct objc_property *objc_property_t;

类在runtime中的表示

//类在runtime中的表示struct objc_class { Class isa;//指针,顾名思义,表示是一个什么, //实例的isa指向类对象,类对象的isa指向元类#if !__OBJC2__ Class super_class; //指向父类 const char *name; //类名 long version; long info; long instance_size struct objc_ivar_list *ivars //成员变量列表 struct objc_method_list **methodLists; //方法列表 struct objc_cache *cache;//缓存 //一种优化,调用过的方法存入缓存列表,下次调用先找缓存 struct objc_protocol_list *protocols //协议列表 #endif} OBJC2_UNAVAILABLE;/* Use `Class` instead of `struct objc_class *` */相信很多看官看到这里的时候,就已经有想关屏幕的冲动了,下面给大家分享一下isa指针和meta class(元类)每个对象都会有一个它所属的类。这是面向对象的基本概念,但是在OC中,这对所有数据结构有效。任何数据结构,只要在恰当的位置具有一个指针指向一个class,那么,它都可以被认为是一个对象。isa:是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针, 指向meteClass(元类)。元类保存了类方法的列表。当类方法被调用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针最终指向的是一个根元类(root meteClass).根元类的isa指针指向本身,这样形成了一个封闭的内循环
一个OC的类其实也是一个对象,意思就是你可以向一个类发送消息。为了可以调用类方法,这个类的isa指针必须指向一个包含这些类方法的类结构体。meta-class之所以重要,是因为它存储着一个类的所有类方法。每个类都会有一个单独的meta-class,因为每个类的类方法基本不可能完全相同根据这个规则,所有的meta-class使用基类的meta-class作为它们的类,而基类的meta-class也是属于它自己,也就是说基类的meta-class的isa指针指向它自己。这样一来,整个继承体系中的实例、类和meta-class都派生自继承体系中的基类。对于NSObject继承体系来说,NSObject的实例方法对体系中所有的实例、类和meta-class都是有效的;NSObject的类方法对于体系中所有的类和meta-class都是有效的meta-class要保证类对象具有继承体系中基类的所有实例和类方法,以及继承体系中的所有中间类方法。对于所有NSObject继承体系下的类,NSObject的实例方法和协议方法对他们和他们meta-class的对象都要有效。

runtime的应用:

1.动态创建一个类(比如KVO的底层实现)

 2.动态地为某个类添加属性\方法, 修改属性值\方法

3.遍历一个类的所有成员变量(属性)\所有方法

实质上,以上的是通过相关方法来获取对象或者类的isa指针来实现的。

相关函数

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:iOS开发日记17

关键词:IOS

IOS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。