- (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);
}