首先导入<objc/message.h>头文件
runtime替换方法的:
在类的+load方法中进行,因为这个东西只会调用一次。添加功能记得调用原方法(此时原方法已经被新方法替换),类方法和实例方法的替换调用的方法是不太一样的。
runtime添加方法:
一般用调用performSelecter(),在 -(Bool)ResolveInstanceMethod:(SEL)sel{} 中可以拦截到调用的方法,在这里也可以拦截到没有实现的方法(注意重写方法需要调用 [super reloveMethod]方法),添加方法add......,注意查一下官方文档,看一下写法:
比如要添加的方法:
void eat(id self,SEL _cmd){ //这是个没有参数的添加方法
}
void eat(id self,SEL _cmd,id para){}//带一个参数的添加方法
//添加
class_addMethod(self,sel,(IMP)eat,"v@:");
class_addMethod(self,sel,(IMP)eat,"v@:@");
Runtime给类或分类添加属性:
可以给分类添加一个全局静态变量,实现他的set和get方法,但是不够好。
可以用关联方法:
//添加一个name属性
-(void)setName:(NSString *)name{
//para1:给谁关联属性,para2:关联属性的key值,para3:关联属性的策略
objc_setAssociatedObject(self,@"name",OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSString *)name{
objc_getAssociatedObject(self,@"name");
}