首先導入<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");
}