通过查看网上资料对IOS Runtime的简单了解与描述

通过查看网上资料对IOS Runtime的简单了解与描述

自己做ios开发已经有三四年了,从最初的做ios平台游戏,到后来的独自学习ios应用开发,独立的使用第三方库进行及时聊天软件的开发,到后来独立为公司开发了三款面向市场和用户的购物app,并提交到苹果审核。经历了一个通过不断的学习,不断提高的过程。现在自觉什么样的项目都可以实现,但是始终都是一个只会写代码的程序员,对已IOS的原理还是不够理解,导致写代码出现bug只能一步步的debug通过断点查看,能修改好但是不知道为什么会有这种问题,所以现在在网上查看了一些IOS 最根本 的概念来学习,runtime便是其中之一,后续我还会通过查看各种资料来简单的解释下runloop,block,coreAnimation等。

本文通过runtime原理对runtime(运行时)进行简单的说明。

  • runtime(运行时原理)

runtime(运行时)原理

runtime : 运行时机制
首先必须明白的:
1.什么是runtime运行时机制
1> runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API
2> 平时编写的OC代码, 在程序运行过程中, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者
下面这就是一个实例,(在前面的文章中讲到过了!通过编译成c语言,我们可以看到底层文件)
OC :
[[Human alloc] init]
上面的Human对象创建时候,
runtime :
objc_msgSend(objc_msgSend(“Human” , “alloc”), “init”)

东西放在这里,那我们要怎么理解这个过程呢
我说一下自己对于这个过程的理解,首先通过消息机制进行Human中alloc方法的动态调用,然后生成的Human对象再次通过runtime运行时的消息机制进行init方法动态调用。可以看出,所有的OC形式的代码,通过底层的runtime机制编译成了基于C的消息机制进行动态的类创建和属性对象赋值。

2.上面是大体上的runtime的运行原理,那具体的呢,我们来看下面
1>在程序的运行过程中,可以动态的创建一个类
2>在程序的运行过程中,可以动态的为一个类添加/修改方法和属性
3>在程序的运行过程中,可以遍历一个类的所有成员属性和方法并进行调用。

我们看下面一段代码:

代码块

代码块语法遵循标准markdown代码,例如:

#import 
@interface PYPerson : NSObject 
@property (nonatomic, assign) int age; 
@property (nonatomic, assign) int height; 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, assign) int age2; 
@property (nonatomic, assign) int height2; 
@property (nonatomic, assign) int age3; 
@property (nonatomic, assign) int height3; 
@property (nonatomic, assign) int age4; 
@property (nonatomic, assign) int height4; 
@end
#import "PYPerson.h"
@implementation PYPerson
(void)encodeWithCoder:(NSCoder )encoder 
{ 
unsigned int count = 0; 
Ivar ivars = class_copyIvarList([PYPerson class], &count); 
    for (int i = 0; i<count; i++) {
        // 取出i位置对应的成员变量
        Ivar ivar = ivars[i]; 
        // 查看成员变量
        const char *name = ivar_getName(ivar); 
        // 归档
        NSString *key = [NSString stringWithUTF8String:name];
        id value = [self valueForKey:key];
        [encoder encodeObject:value forKey:key];
     } 
    free(ivars); 
}
(id)initWithCoder:(NSCoder *)decoder 
{ 
if (self = [super init]) {
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([PYPerson class], &count); 
    for (int i = 0; i<count; i++) {
        // 取出i位置对应的成员变量
        Ivar ivar = ivars[i]; 
        // 查看成员变量
        const char *name = ivar_getName(ivar); 
        // 归档
        NSString *key = [NSString stringWithUTF8String:name];
        id value = [decoder decodeObjectForKey:key]; 
        // 设置到成员变量身上
        [self setValue:value forKey:key];
    } 
    free(ivars);
    } 
    return self; 
} 
@end

从上面这段代码,我们可以看出来整个NSCoding(归档和解档), 利用runtime遍历模型对象的所有属性.
涉及到几个方法我们需要介绍一下
1.objc_msgSend 消息发送机制
2.class_copyIvarList 遍历所有的成员属性
3.class_copyMethodList 遍历所有的方法(这个在以上代码中没有使用,但是也是对于runtime使用频率很高的一个方法)

还有几个属性定义
1.Ivar 成员变量
2.Method 成员方法

以上是动态的创建成员变量,如果是动态的创建方法,就会通过class_copyMethodList获取相关的方法。

runtime还可以运用到一下方向:
字典 –> 模型 (利用runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上)
KVO(利用runtime动态产生一个类) KVO的介绍我们下一张会拿来说一下
用于封装框架(想怎么改就怎么改) 这个具体的实现暂时我还不了解,参考来得但是后续会跟进这个用于封装框架的实现方式。

以上参考自http://my.oschina.net/panyong/blog/403562


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值