- (void)createClass
{
Class MyClass = objc_allocateClassPair([NSObject class], "myclass", 0);
//添加一個NSString的變量,第四個參數是對其方式,第五個參數是參數類型
if (class_addIvar(MyClass, "itest", sizeof(NSString *), 0, "@")) {
NSLog(@"add ivar success");
}
//myclasstest是已經實現的函數,"v@:"這種寫法見參數類型連接
class_addMethod(MyClass, @selector(myclasstest:), (IMP)myclasstest, "v@:");
//注冊這個類到runtime系統中就可以使用他了
objc_registerClassPair(MyClass);
//生成了一個實例化對象
id myobj = [[MyClass alloc] init];
NSString *str = @"asdb";
//給剛剛添加的變量賦值
//? ? object_setInstanceVariable(myobj, "itest", (void *)&str);在ARC下不允許使用
[myobj setValue:str forKey:@"itest"];
//調用myclasstest方法,也就是給myobj這個接受者發送myclasstest這個消息
[myobj myclasstest:10];
}
//這個方法實際上沒有被調用,但是必須實現否則不會調用下面的方法
- (void)myclasstest:(int)a
{
}
//調用的是這個方法
static void myclasstest(id self, SEL _cmd, int a) //self和_cmd是必須的,在之后可以隨意添加其他參數
{
Ivar v = class_getInstanceVariable([self class], "itest");
//返回名為itest的ivar的變量的值
id o = object_getIvar(self, v);
//成功打印出結果
NSLog(@"%@", o);
NSLog(@"int a is %d", a);
}