轉(zhuǎn)之http://www.tuicool.com/articles/FbuaEve
本代碼需事先導(dǎo)入部分 objc/runtime
中的頭文件,如下所示
import <objc/runtime.h> #import <objc/message.h>
動(dòng)態(tài)創(chuàng)建類
類的創(chuàng)建分為兩步,添加 成員變量
需要在這兩步操作之間,添加 成員方法
則無(wú)此要求
Class objc_allocateClassPair(Class superClass,const char* className,size_t extraBytes);
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 是函數(shù)指針// typedef id (IMP)(id, SEL, ...);IMP i = imp_implementationWithBlock(^(id this,id some){ NSLog(@"%@",some); return @111;});//注冊(cè)方法名為 test: 的方法SEL s = sel_registerName("test:");class_addMethod(Test, s, i, "i@:");//結(jié)束類的定義objc_registerClassPair(Test);
動(dòng)態(tài)創(chuàng)建對(duì)象
采用上邊代碼創(chuàng)建的 Test
類創(chuàng)建對(duì)象,并通過(guò)該對(duì)象操作成員方法和成員變量
//創(chuàng)建對(duì)象id t = [[Test alloc]init];//KVC 動(dòng)態(tài)改變 對(duì)象t 中的實(shí)例變量[t setValue:@"張三" forKey:@"name"];NSLog(@"%@",[t valueForKey:@"name"]);//調(diào)用 t 對(duì)象中的 s 方法選擇器對(duì)于的方法id result = objc_msgSend(t, s,@"傳送內(nèi)容");NSLog(@"%@",result);
運(yùn)行結(jié)果
2014-08-15 00:11:00.239 Test[44644:303] 張三2014-08-15 00:11:00.240 Test[44644:303] 傳送內(nèi)容2014-08-15 00:11:00.241 Test[44644:303] 111