1.動(dòng)態(tài)添加方法蜒简,首先定義添加的函數(shù)
對(duì)于自己提前定義的方法eat:來說色徘,很明顯這是c語音定義的方法底哗,與平常方法不同的是他多了兩個(gè)參數(shù)宪哩,其實(shí)OC當(dāng)中每個(gè)方法里面都有這兩個(gè)參數(shù)常熙,他們是隱藏參數(shù)纬乍,一個(gè)代表本身,另一個(gè)代碼的是方法名SEL
/**
* 吃方法
*
* @param self 隱藏參數(shù) self
* @param _cmd 隱藏參數(shù) SEL
* @param param 參數(shù)
*/
void eat(id self, SEL _cmd, NSString *param){
NSLog(@"調(diào)用eat 參數(shù):1%@ 參數(shù)2:%@ 參數(shù)3:%@",self,NSStringFromSelector(_cmd),param);
}
2.動(dòng)態(tài)添加
/**
* 動(dòng)態(tài)添加方法
*
* @param self cls:為哪個(gè)類添加方法
* @param sel SEL:添加方法的方法編號(hào)(方法名)是什么
* @param IMP IMP:方法實(shí)現(xiàn)
* @param const char * types方法類型
*
* @return 返回是否添加成功
*/
BOOL isSuccess = class_addMethod(self, sel, (IMP)eat, "v@:@");
最后一個(gè)參數(shù):可以通過查閱官方文檔了解
如果需要帶兩個(gè)對(duì)象裸卫,則可以寫成 "v@:@@"
如果需要帶兩個(gè)基本數(shù)據(jù)類型仿贬,如float,則可以寫成"v@:ff"
如果返回值是對(duì)象墓贿,則可以寫成"@@:ff"
實(shí)例一
1.當(dāng)UIView 類加載時(shí)就添加方法
void eat(id self, SEL _cmd) {
NSLog(@"uiview 調(diào)用了eat方法");
}
+ (void)load {
class_addMethod(self, NSSelectorFromString(@"eat"), (IMP)eat, "v@:");
}
調(diào)用:[view performSelector:@selector(eat)];
2.當(dāng)調(diào)用時(shí)才添加方法
void eat(id self, SEL _cmd) {
NSLog(@"uiview 調(diào)用了eat方法");
}
// 當(dāng)一個(gè)對(duì)象調(diào)用未實(shí)現(xiàn)的方法茧泪,會(huì)調(diào)用這個(gè)方法處理,并且會(huì)把對(duì)應(yīng)的方法列表傳過來.
// 剛好可以用來判斷,未實(shí)現(xiàn)的方法是不是我們想要?jiǎng)討B(tài)添加的方法
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == NSSelectorFromString(@"eat")) {
class_addMethod(self, sel, (IMP)eat, "v@:");
return YES;
}
}
調(diào)用:[view performSelector:@selector(eat)];
3.當(dāng)然也是可以在uiview分類中為其他類添加方法聋袋,也是一樣的队伟,可以采用方式一