-
动态添加方法
-
这样的做法是:eat这个方法在person类初始化的时候就加入到内存序列中了,不管使用没使用
Person *p = [[Person alloc] init];
// 这个时候调用eat,由于我们在类里面并没有定义方法,所以程序会崩溃,下面我们动态添加方法
[p performSelector:@selector(eat)];
- 动态添加方法(resolveInstanceMethod实现)
// 创建一个函数(方法的实现)
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)];现在我们调用就正常运行了
动态添加属性
- 新建一个NSObject的扩展类,创建name属性
- 实现set,get方法
- (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);