2018之iOS class_addMethod使用

前言

近期項(xiàng)目不急,有時(shí)間看一些自己想看的東西刹淌。記得面試的時(shí)候都是在問(wèn)runtimer的知識(shí)點(diǎn)饶氏,自己雖然知道一點(diǎn)這里面的知識(shí)點(diǎn),但是很零碎有勾。所以在這幾天好好的研究一下疹启。其實(shí)我也問(wèn)過(guò)一個(gè)做sdk的朋友,他也說(shuō)基本上平時(shí)開(kāi)發(fā)用的不是很多蔼卡。做sdk的用的比較多喊崖,因?yàn)橐@取開(kāi)發(fā)人員的某些屬性,或者在不知道開(kāi)發(fā)人員的類的結(jié)構(gòu)下添加方法等雇逞。本次說(shuō)class_addMethod 這個(gè)很有用的方法荤懂,感覺(jué)他就是一個(gè)作弊器。

正文

/** 
 * Adds a new method to a class with a given name and implementation.
 * 
 * @param cls The class to which to add a method.
 * @param name A selector that specifies the name of the method being added.
 * @param imp A function which is the implementation of the new method. The function must take at least two arguments—self and _cmd.
 * @param types An array of characters that describe the types of the arguments to the method. 
 * 
 * @return YES if the method was added successfully, otherwise NO 
 *  (for example, the class already contains a method implementation with that name).
 *
 * @note class_addMethod will add an override of a superclass's implementation, 
 *  but will not replace an existing implementation in this class. 
 *  To change an existing implementation, use method_setImplementation.
 */
OBJC_EXPORT BOOL class_addMethod(Class cls, SEL name, IMP imp, 
                                 const char *types) 
     __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);

這個(gè)是API文檔的解釋塘砸,基本就是說(shuō)這可以加入新的方法到一個(gè)類里面节仿,然后介紹這里面幾個(gè)參數(shù)的作用之類的。我感覺(jué)無(wú)論什么都要自己親身實(shí)踐才行掉蔬,所以直接先上代碼:

- (void)viewDidLoad {
    [super viewDidLoad];

   //動(dòng)態(tài)添加一個(gè)方法
    Person *p = [[Person alloc]init];
    class_addMethod([Person class], @selector(printPerson), class_getMethodImplementation([ViewController class], @selector(find)), "v@:");
    [p performSelector:@selector(printPerson)];
}

非常簡(jiǎn)單的代碼片段廊宪,我有一個(gè)Person類,現(xiàn)在我要在運(yùn)行的時(shí)候給他增加一個(gè)方法女轿,并且調(diào)用這個(gè)方法箭启。

 class_addMethod(Class cls, SEL name, IMP imp, 
                                 const char *types)

首先我們看看這個(gè)方法里面的參數(shù):
Class cos:我們需要一個(gè)class,比如我的[Person class]蛉迹。
SEL name:這個(gè)很有意思傅寡,這個(gè)名字自己可以隨意想,就是添加的方法在本類里面叫做的名字北救,但是方法的格式一定要和你需要添加的方法的格式一樣荐操,比如有無(wú)參數(shù)。
IMP imp:IMP就是Implementation的縮寫(xiě)珍策,它是指向一個(gè)方法實(shí)現(xiàn)的指針托启,每一個(gè)方法都有一個(gè)對(duì)應(yīng)的IMP。這里需要的是IMP膛壹,所以你不能直接寫(xiě)方法驾中,需要用到一個(gè)方法:

OBJC_EXPORT IMP class_getMethodImplementation(Class cls, SEL name) 
     __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);

這個(gè)方法也是runtime的方法唉堪,就是獲得對(duì)應(yīng)的方法的指針,也就是IMP肩民。
const char *types:這一個(gè)也很有意思唠亚,我剛開(kāi)始也很費(fèi)解,結(jié)果看了好多人的解釋我釋然了持痰,知道嗎灶搜,我釋然啦,????工窍。這個(gè)東西其實(shí)也很好理解:
比如:”v@:”意思就是這已是一個(gè)void類型的方法割卖,沒(méi)有參數(shù)傳入。
再比如 “i@:”就是說(shuō)這是一個(gè)int類型的方法患雏,沒(méi)有參數(shù)傳入鹏溯。
再再比如”i@:@”就是說(shuō)這是一個(gè)int類型的方法,又一個(gè)參數(shù)傳入淹仑。
好了丙挽,參數(shù)解釋完了,還有一點(diǎn)需要注意匀借,用這個(gè)方法添加的方法是無(wú)法直接調(diào)用的颜阐,必須用performSelector:調(diào)用。為甚么呢吓肋?凳怨??
因?yàn)閜erformSelector是運(yùn)行時(shí)系統(tǒng)負(fù)責(zé)去找方法的是鬼,在編譯時(shí)候不做任何校驗(yàn)肤舞;如果直接調(diào)用編譯是會(huì)自動(dòng)校驗(yàn)。
知道為甚么了吧屑咳,你添加方法是在運(yùn)行時(shí)添加的萨赁,你在編譯的時(shí)候還沒(méi)有這個(gè)本類方法弊琴,所以當(dāng)然不行啦兆龙。

結(jié)束

啦啦啦,結(jié)束啦敲董,代碼示例在此,如果您覺(jué)得還可以紫皇,給個(gè)??吧。

轉(zhuǎn)自:http://blog.csdn.net/github_30943901/article/details/51210346

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腋寨,一起剝皮案震驚了整個(gè)濱河市聪铺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萄窜,老刑警劉巖铃剔,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撒桨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡键兜,警方通過(guò)查閱死者的電腦和手機(jī)凤类,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)普气,“玉大人谜疤,你說(shuō)我怎么就攤上這事∠志鳎” “怎么了夷磕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)仔沿。 經(jīng)常有香客問(wèn)我坐桩,道長(zhǎng),這世上最難降的妖魔是什么封锉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任撕攒,我火速辦了婚禮,結(jié)果婚禮上烘浦,老公的妹妹穿的比我還像新娘抖坪。我一直安慰自己,他們只是感情好闷叉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布擦俐。 她就那樣靜靜地躺著,像睡著了一般握侧。 火紅的嫁衣襯著肌膚如雪蚯瞧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天品擎,我揣著相機(jī)與錄音埋合,去河邊找鬼。 笑死萄传,一個(gè)胖子當(dāng)著我的面吹牛甚颂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秀菱,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼振诬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了衍菱?” 一聲冷哼從身側(cè)響起赶么,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脊串,沒(méi)想到半個(gè)月后辫呻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體清钥,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年放闺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了循捺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雄人,死狀恐怖从橘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情础钠,我是刑警寧澤恰力,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站旗吁,受9級(jí)特大地震影響踩萎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜很钓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一香府、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧码倦,春花似錦企孩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至推汽,卻和暖如春补疑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歹撒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工莲组, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暖夭。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓锹杈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鳞尔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嬉橙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉早直,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,709評(píng)論 0 9
  • 我們常常會(huì)聽(tīng)說(shuō) Objective-C 是一門動(dòng)態(tài)語(yǔ)言寥假,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,192評(píng)論 0 7
  • Objective-C語(yǔ)言是一門動(dòng)態(tài)語(yǔ)言霞扬,他將很多靜態(tài)語(yǔ)言在編譯和鏈接時(shí)期做的事情放到了運(yùn)行時(shí)來(lái)處理糕韧。這種動(dòng)態(tài)語(yǔ)言...
    tigger丨閱讀 1,400評(píng)論 0 8
  • 我的喜好簡(jiǎn)單到手邊的一本書(shū)枫振,一本手不釋卷的散文,比如劉程亮的《一個(gè)人的村莊》萤彩。 這本書(shū)是我從微信公眾號(hào)的推薦書(shū)籍里...
    筱璿閱讀 746評(píng)論 0 2
  • 2017年3月8日雀扶,我的二寶來(lái)了 此后的每一天杖小,充滿了各種磨難 先是身體反應(yīng)出的各種妊娠反應(yīng) 接著是公司的各種刁難...
    peny佩妮閱讀 275評(píng)論 0 0