runtime动态添加方法属性

2018-07-20  本文已影响12人  StoneWing

    Person *p = [[Person alloc] init];
    //  这个时候调用eat,由于我们在类里面并没有定义方法,所以程序会崩溃,下面我们动态添加方法
    [p performSelector:@selector(eat)];
// 创建一个函数(方法的实现)
void eat(id self, SEL _cmd)
{
    NSLog(@"吃东西");
}

+ (BOOL)resolveInstanceMethod:(SEL)sel {
    
    // 判断是否调用的这个方法
    if (sel == @selector(eat)) {
        // 添加方法:当前类,方法,IMP,char(v:无返回值,@:(第一个参数)self,:(第二个参数)SEL)
        class_addMethod(self, sel, (IMP)eat, "v@:");
        // 执行完成
        return YES;
    }
    
    return [super resolveInstanceMethod:sel];
}

//   [p performSelector:@selector(eat)];现在我们调用就正常运行了

动态添加属性

- (void)setName:(NSString *)name {
    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name {
    
    return objc_getAssociatedObject(self, @"name");
}
  NSObject *objc = [[NSObject alloc] init];
    objc.name = @"123";
    NSLog(@"%@",objc.name);
上一篇 下一篇

猜你喜欢

热点阅读