runtime 动态添加属性和方法

转之http://www.tuicool.com/articles/FbuaEve
本代码需事先导入部分 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,856评论 0 9
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,241评论 0 7
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    made_China阅读 1,235评论 0 7
  • Objective-C语言是一门动态语言,他将很多静态语言在编译和链接时期做的事情放到了运行时来处理。这种动态语言...
    tigger丨阅读 1,471评论 0 8
  • 原文出处:南峰子的技术博客 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了...
    _烩面_阅读 1,319评论 1 5