用方法調(diào)配技術(shù)調(diào)試黑盒方法

Object-C是允許進(jìn)行方法調(diào)配的隶债,什么叫方法調(diào)配呢?解釋一下。
以NSString類為例,其中有l(wèi)owercaseString和uppercaseString方法雳旅,獲取兩個(gè)方法的實(shí)例:

Method originalMethod = class_getInstanceMethod([NSString class], @selector(lowercaseString));
Method swappedMethod = class_getInstanceMethod([NSString class], @selector(uppercaseString));

方法交換:

method_exchangeImplementations(originalMethod, swappedMethod);

從現(xiàn)在開始蔗草,如果在NSString實(shí)例上調(diào)用lowercaseString吩跋,那么執(zhí)行的將是uppercaseString方法撇叁,反之亦然蜗搔。

類的方法列表會(huì)把選擇子的名稱映射到相關(guān)的方法實(shí)現(xiàn)之上,使得“動(dòng)態(tài)消息派發(fā)系統(tǒng)”能夠據(jù)此找到應(yīng)該調(diào)用的方法侨糟。這些方法均以函數(shù)指針的形式來表示碍扔,這種指針叫做IMP,其原型如下:

id (*IMP) (id, SEL, ...)

上述方法其實(shí)是交換了IMP指針秕重。
但是在實(shí)際使用的過程中不同,交換兩個(gè)方法的意義并不大,我們可以把這種技術(shù)應(yīng)用在哪里呢溶耘?
我們可以在類別中寫一個(gè)方法:

@implementation NSString (MyAdditions)
- (NSString *)myLowercaseString
{
    NSString *lowercase = [self myLowercaseString];
    NSLog(@"%@ => %@", self, lowercase);
    return lowercase;
}
@end

看上去此方法會(huì)死循環(huán)二拐,不過此方法是準(zhǔn)備和lowercaseString方法互換的:

Method originalMethod = class_getInstanceMethod([NSString class], @selector(lowercaseString));
Method swappedMethod = class_getInstanceMethod([NSString class], @selector(myLowercaseString));
method_exchangeImplementations(originalMethod, swappedMethod);

通過此方案,開發(fā)者可以為那些“完全不知道其具體實(shí)現(xiàn)”的黑盒方法增加日志記錄功能凳兵,這非常有助于程序調(diào)試百新。然而只在調(diào)試時(shí)使用,很少有人采用此方法來永久改動(dòng)某個(gè)類的功能庐扫。若是濫用饭望,反而會(huì)令代碼變得不易懂且難維護(hù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末形庭,一起剝皮案震驚了整個(gè)濱河市铅辞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萨醒,老刑警劉巖斟珊,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異富纸,居然都是意外死亡囤踩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門晓褪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堵漱,“玉大人,你說我怎么就攤上這事涣仿∏诼” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵变过,是天一觀的道長。 經(jīng)常有香客問我涝涤,道長媚狰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任阔拳,我火速辦了婚禮崭孤,結(jié)果婚禮上类嗤,老公的妹妹穿的比我還像新娘。我一直安慰自己辨宠,他們只是感情好遗锣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嗤形,像睡著了一般精偿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赋兵,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天笔咽,我揣著相機(jī)與錄音,去河邊找鬼霹期。 笑死叶组,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的历造。 我是一名探鬼主播甩十,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吭产!你這毒婦竟也來了侣监?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤垮刹,失蹤者是張志新(化名)和其女友劉穎达吞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荒典,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酪劫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寺董。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片覆糟。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖遮咖,靈堂內(nèi)的尸體忽然破棺而出滩字,到底是詐尸還是另有隱情,我是刑警寧澤御吞,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布麦箍,位于F島的核電站,受9級(jí)特大地震影響陶珠,放射性物質(zhì)發(fā)生泄漏挟裂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一揍诽、第九天 我趴在偏房一處隱蔽的房頂上張望诀蓉。 院中可真熱鬧栗竖,春花似錦、人聲如沸渠啤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沥曹。三九已至份名,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間架专,已是汗流浹背同窘。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留部脚,地道東北人想邦。 一個(gè)月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像委刘,于是被迫代替她去往敵國和親丧没。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

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