runtime 動(dòng)態(tài)添加方法和屬性和成員變量

- (void)createClass

{

Class MyClass = objc_allocateClassPair([NSObject class], "myclass", 0);

//添加一個(gè)NSString的變量,第四個(gè)參數(shù)是對(duì)其方式,第五個(gè)參數(shù)是參數(shù)類型

if (class_addIvar(MyClass, "itest", sizeof(NSString *), 0, "@")) {

NSLog(@"add ivar success");

}

//myclasstest是已經(jīng)實(shí)現(xiàn)的函數(shù),"v@:"這種寫法見參數(shù)類型連接

class_addMethod(MyClass, @selector(myclasstest:), (IMP)myclasstest, "v@:");

//注冊(cè)這個(gè)類到runtime系統(tǒng)中就可以使用他了

objc_registerClassPair(MyClass);

//生成了一個(gè)實(shí)例化對(duì)象

id myobj = [[MyClass alloc] init];

NSString *str = @"asdb";

//給剛剛添加的變量賦值

//? ? object_setInstanceVariable(myobj, "itest", (void *)&str);在ARC下不允許使用

[myobj setValue:str forKey:@"itest"];

//調(diào)用myclasstest方法,也就是給myobj這個(gè)接受者發(fā)送myclasstest這個(gè)消息

[myobj myclasstest:10];

}

//這個(gè)方法實(shí)際上沒有被調(diào)用,但是必須實(shí)現(xiàn)否則不會(huì)調(diào)用下面的方法

- (void)myclasstest:(int)a

{

}

//調(diào)用的是這個(gè)方法

static void myclasstest(id self, SEL _cmd, int a) //self和_cmd是必須的,在之后可以隨意添加其他參數(shù)

{

Ivar v = class_getInstanceVariable([self class], "itest");

//返回名為itest的ivar的變量的值

id o = object_getIvar(self, v);

//成功打印出結(jié)果

NSLog(@"%@", o);

NSLog(@"int a is %d", a);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容