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
相关文章推荐
- Android HandlerThread 源码笔记
- html中的<b>和<strong>有什么区别呢?
- Android网页宽度自适应手机屏幕宽度的方法
- 向tekkaman学习
- 【IOS 开发学习总结-OC-57】★UI之UICollectionView 与UICollectionViewController
- APP<疯狂食材>开发总结
- Android编程开发之打开文件的Intent及使用方法
- ASP.NET动态网站制作(14)-- CSS3
- java 之 file类的一些方法
- iOS8统一的系统提示控件——UIAlertController
- Maximizing XOR
- http 错误代码表
- docker 容器创建参数错误记录
- Android 自定义View 中的OnMeasure的用法
- MD5加密和简单加密
- 谈谈HttpClient使用详解
- EditText修改软键盘回车图标以及实现软键盘回车响应
- SSL协议详解
- SSL证书
- 关于touchesBegan获取多触点的失败