您的位置:首页 > 其它

objc/runtime 探索

2015-10-19 11:37 127 查看


前言

最近闲来无事,打算对
objc/runtime
进行一番研究,今晚把API翻了一遍,拿出了如下的一些有趣代码,本代码需事先导入部分
objc/runtime
中的头文件,如下所示
#import <objc/runtime.h>
#import <objc/message.h>


动态创建类

类的创建分为两步,添加
成员变量
需要在这两步操作之间,添加
成员方法
则无此要求

1. 
Class objc_allocateClassPair(Class superClass,const
char* className,size_t extraBytes);


2. 
void objc_registerClassPair(Class cls);


Class Test= objc_allocateClassPair([NSObject class], "Test", 0);
//为类添加变量
class_addIvar(Test, "_name", sizeof(NSString*), log2(sizeof(NSString*)), @encode(NSString*));
//为类添加方法
//IMP 是函数指针
// typedef id (*IMP)(id, SEL, ...);
IMP i = imp_implementationWithBlock(^(id this,id some){
NSLog(@"%@",some);
return @111;
});
//注册方法名为 test: 的方法
SEL s = sel_registerName("test:");
class_addMethod(Test, s, i, "i@:");
//结束类的定义
objc_registerClassPair(Test);


动态创建对象

采用上边代码创建的
Test
类创建对象,并通过该对象操作成员方法和成员变量

//创建对象
id t = [[Test alloc]init];
//KVC 动态改变 对象t 中的实例变量
[t setValue:@"张三" forKey:@"name"];
NSLog(@"%@",[t valueForKey:@"name"]);
//调用 t 对象中的 s 方法选择器对于的方法
id result = objc_msgSend(t, s,@"传送内容");
NSLog(@"%@",result);


运行结果

2014-08-15 00:11:00.239 Test[44644:303] 张三
2014-08-15 00:11:00.240 Test[44644:303] 传送内容
2014-08-15 00:11:00.241 Test[44644:303] 111
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: