我的runtime理解和用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的runtime理解和用法相关的知识,希望对你有一定的参考价值。
1.什么是运行时机制
1)运行时机制是比较低层的纯c语言的API文档,属于c语言库,包含了许多底层的c语言API
2)oc中的对象,方法在运行时才知道它时什么类型的,这个类型是动态生成的像KVO的底层实现就是运用了runtime。
3)我们平时编码最终会转换成runtime的c语言代码,runtime算是一个幕后工作者。
像在官方API文档中就有:
[[Person alloc] init]其最后会转换成obje_msgSend("Person", "alloc") ,"init");
2.怎么利用runtime呢?
1)像一些属于oc底层的东西,可以在层运行时动态的创建一个类,即KVO的派生类。
2)在程序运行过层中,动态的为某个类添加属性方法,修改属性值和方法像归档中:字典转模型就是这样的
归档:需要存取数据和读区数据,即存档和解档
例:
需要导入<objc/runtime.h>
- (void)encodeWithCoder:(NSCoder *)encoder
{
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([LJPerson class], &count);
// 遍历
for (int i = 0; i < count; i++)
{
// 取出文件对应的成员变量
Ivar ivar = ivars[i];
// 查看成员变量
const char name = ivar_getName(ivar);
// 归档
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForkey:key];
}
// 释放
[free ivars];
}
// 解档
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super init])
{
unsigned int count = 0;
IVar *ivars = class_copyIvarList([LJPerson class], &count);
for (int=0; i < count; i++)
{
// 取出文件对应的成员变量
Ivar ivar = ivars[i];
// 查看成员变量
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[self setValue:value forkey:key];
}
return free[ivars];
}
return self;
}
3)产看隐藏的成员变量和成员方法
代码实现:#import<objc/runtime.h>
+ (void)initalize
{
unsigned int count = 0;
// 拷贝出成员变量列表
Ivar *ivars = class_copyIvarList([UITextField class], count);
// 遍历
for (int i = 0; i < count; i++)
{
// 取出成员变量
Ivar ivar = *(ivars *i);
// 打印
NSLog(@"%s", ivar_getName(ivar));
}
}
关于objc_msgSend:给对象发送消息
massage send 如果找不到相应的对象后序会如何处理
(1)如果用实例对象掉用实例方法,会到实例对象的isa指针指向的对象进行操作。
(2)如果用的是类方法,就会到类对象的isa指针指向的对象中找
如果(1)没有找到就会在相应操作对象的方法liebi如果没有找到相应的对象后,就会到对象中的缓存列表中找。
还没有找到相应的z类核方法则会到父类中执行(1)(2)步操作
依此类推如果没有找到的话,就会掉用拦截
如果在对象方法中还没有找到的话,就会去父类指向的指针中找。
以上是关于我的runtime理解和用法的主要内容,如果未能解决你的问题,请参考以下文章
php中的set_magic_quotes_runtime()作用和用法
runtime-only和runtime-compiler的区别
runtime-compiler和runtime-only的区别