Skip to content

Latest commit

 

History

History
34 lines (30 loc) · 1.17 KB

如何实现动态添加方法和属性.md

File metadata and controls

34 lines (30 loc) · 1.17 KB

如何实现动态添加方法和属性

- (void)createClass{
    Class myClass = objc_allocateClassPair([NSObject class], "myClass", 0);
    //添加一个NSString的变量,第四个参数是对其方式,第五个参数是参数类型
    if (class_addIvar(myClass, "name", sizeof(NSString *), 0, "@")) {
        NSLog(@"添加变量成功");
    }
    //myclasstest是已经实现的函数,"v@:"这种写法见参数类型连接
    class_addMethod(myClass, @selector(myclasstest:), (IMP)myclasstest, "v@:");
    //注册这个类到runtime系统中就可以使用它了
    objc_registerClassPair(myClass);
    //生成了一个实例化对象
    id myObj = [[myClass alloc] init];
    NSString *str = @"abc";
    [myObj setValue:str forKey:@"name"];
    [myObj myclasstest:666];
}

//这个方法实际上没有被调用,但是必须实现否则不会调用下面的方法
- (void)myclasstest:(int)a{
    
}
//调用的是这个方法
static void myclasstest(id self,SEL _cmd, int a){
    Ivar v = class_getInstanceVariable([self class], "name");
    //返回名为name的ivar的变量的值
    id o = object_getIvar(self, v);
    NSLog(@"%@",o);
    NSLog(@"int a is %d",a);
}