Method Swizzling

Method Swizzling是runtime應(yīng)用的體現(xiàn)辣辫,那么關(guān)于Method Swizzling的應(yīng)用和注意事項(xiàng)在下面做簡單的總結(jié):

Method Swizzling原理:

每個類都維護(hù)一個方法(Method)列表,Method則包含SEL和其對應(yīng)IMP的信息空入,方法交換做的事情就是把SEL和IMP的對應(yīng)關(guān)系斷開络它,并和新的IMP生成對應(yīng)關(guān)系。

交換前:Asel->AImp Bsel->BImp

交換后:Asel->BImp Bsel->AImp

Method Swizzling用途:

1歪赢、面向切面編程: 數(shù)據(jù)統(tǒng)計(jì);比如為了統(tǒng)計(jì)viewwillappear調(diào)用的次數(shù)单料,我們可以在基類(其他VC繼承的類)的VC里面埋凯,添加如下代碼就可以統(tǒng)計(jì)viewwillappear被調(diào)用的次數(shù):

+(void)load{//load方法在main()函數(shù)執(zhí)行前就被執(zhí)行//確保里面的方法被執(zhí)行一次

??? static dispatch_once_t onceToken;????

dispatch_once(&onceToken, ^{???????

?[self swizzingClass:[self class] originSel:@selector(viewWillAppear:) newSel:@selector(custom_viewWillAppear:)];???

?});

}

+(void)swizzingClass:(Class)class? originSel:(SEL)originSel? newSel:(SEL)newSel{??? Method originM = class_getInstanceMethod(class, originSel);????

Method newM = class_getInstanceMethod(class, newSel);???

?IMP newImp = method_getImplementation(newM);???

?BOOL addMethodSuccess = class_addMethod(class, newSel, newImp, method_getTypeEncoding(newM));????

if (addMethodSuccess) {???????

?class_replaceMethod(class, originSel, newImp, method_getTypeEncoding(newM));??? }else{????????

method_exchangeImplementations(originM, newM);???

?}??

?}

-(void)custom_viewWillAppear:(BOOL)animate{??

? [super viewWillAppear:animate];????

NSLog(@"%@========%s",[self class],__func__);

}

2、數(shù)組越界問題 扫尖。

法一 ? 通過分類強(qiáng)化 :

@implementation?UIView?(safe)

-?(BOOL)containsObjectAtIndex:(NSInteger)index?{

return?index?>=?0?&&?index?

}

-?(id)objectNilAtIndex:(NSInteger)index{

return?[self?containsObjectAtIndex:index]???[self?objectAtIndex:index]?:?nil;

}

@end

法二 ?使用Method sizzling

@implementation NSArray (StrengThen)

+?(void)load{

static?dispatch_once_t?onceToken;

dispatch_once(&onceToken,?^{

@autoreleasepool?{

[objc_getClass("__NSArray0")?swizzleMethod:@selector(objectAtIndex:)?swizzledSelector:@selector(emptyObjectIndex:)];

[objc_getClass("__NSArrayI")?swizzleMethod:@selector(objectAtIndex:)?swizzledSelector:@selector(arrObjectIndex:)];

[objc_getClass("__NSArrayM")?swizzleMethod:@selector(objectAtIndex:)?swizzledSelector:@selector(mutableObjectIndex:)];

[objc_getClass("__NSArrayM")?swizzleMethod:@selector(insertObject:atIndex:)?swizzledSelector:@selector(mutableInsertObject:atIndex:)];

}

});

}

-?(id)emptyObjectIndex:(NSInteger)index{

return?nil;}

-?(id)arrObjectIndex:(NSInteger)index{

if?(index?>=?self.count?||?index?<?0)?{

return?nil;

return?[self?arrObjectIndex:index];

}

-?(id)mutableObjectIndex:(NSInteger)index{

if?(index?>=?self.count?||?index?<?0)?{

return?nil;

}

return?[self?mutableObjectIndex:index];

}

-?(void)mutableInsertObject:(id)object?atIndex:(NSUInteger)index{

if?(object)?{

[self?mutableInsertObject:object?atIndex:index];

}

?}

?3白对、給全局圖片名稱添加后綴,比如你的工程所有的圖片都更新了换怖,以前都叫xxx.png現(xiàn)在叫xxx_new.png那么如果我們在工程中一張一張改名字比較麻煩甩恼,所以這個時候可以用“黑魔法”來達(dá)到相應(yīng)的效果。(注意這個方法使用過后三方SDK里面引用的圖片可能也會被改變,所以要謹(jǐn)慎使用条摸,綜合考慮下SDK和自己的圖片數(shù)量占比悦污,如果真的想使用就可以在三方SDK中的Bundle圖片資源中,修改三方圖片的名字)钉蒲。

Method Swizzling注意事項(xiàng)

1切端、對自己使用Method Swizzling的地方要及時告訴同伴,否則就會在他人調(diào)用到此塊方法的時候就會不知所以然顷啼。

2踏枣、盡量少用Method Swizzling。雖然Method Swizzling可以讓我們高效地解決某些問題钙蒙,但是如果應(yīng)用不得當(dāng)茵瀑,可能會引發(fā)一系列問題。

3躬厌、swizzling 需要在 + (void)load{}中使用:

? ? ?在+(void)load{}方法中實(shí)現(xiàn)马昨,這樣可以保證方法一定會調(diào)用且不會出現(xiàn)異常;使用dispatch_once來執(zhí)行方法交換烤咧,這樣可以保證只運(yùn)行一次偏陪。load 和initialize區(qū)別:load是只要類所在文件被引用就會被執(zhí)行,而initialize是在類或者其子類的第一個方法被調(diào)用前調(diào)用煮嫌。所以只有當(dāng)此類沒有被引用進(jìn)項(xiàng)目時笛谦,才不會調(diào)用+(void)load{}方法;如果類文件被引用進(jìn)來昌阿,但是沒有使用饥脑,那么initialize也不會被調(diào)用;而此時+(void)load{}方法會被調(diào)用(在main()函數(shù)之前)懦冰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灶轰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刷钢,更是在濱河造成了極大的恐慌笋颤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件内地,死亡現(xiàn)場離奇詭異伴澄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阱缓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門非凌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荆针,你說我怎么就攤上這事敞嗡“湓悖” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵喉悴,是天一觀的道長棱貌。 經(jīng)常有香客問我,道長粥惧,這世上最難降的妖魔是什么键畴? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮突雪,結(jié)果婚禮上起惕,老公的妹妹穿的比我還像新娘。我一直安慰自己咏删,他們只是感情好惹想,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著督函,像睡著了一般嘀粱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辰狡,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天锋叨,我揣著相機(jī)與錄音,去河邊找鬼宛篇。 笑死娃磺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叫倍。 我是一名探鬼主播偷卧,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吆倦!你這毒婦竟也來了听诸?” 一聲冷哼從身側(cè)響起仰坦,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤咕晋,失蹤者是張志新(化名)和其女友劉穎聂喇,沒想到半個月后体捏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疚沐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年晒他,在試婚紗的時候發(fā)現(xiàn)自己被綠了悉罕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片璧南。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖师逸,靈堂內(nèi)的尸體忽然破棺而出司倚,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布动知,位于F島的核電站皿伺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盒粮。R本人自食惡果不足惜鸵鸥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丹皱。 院中可真熱鬧妒穴,春花似錦、人聲如沸摊崭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呢簸。三九已至矮台,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間根时,已是汗流浹背瘦赫。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛤迎,地道東北人确虱。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像忘苛,于是被迫代替她去往敵國和親蝉娜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉扎唾,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評論 0 9
  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20161102/17920.html 因?yàn)镺b...
    F麥子閱讀 665評論 0 1
  • 先來看看巴博薩是如何封蓋詹姆斯的....腋毛 什么是Method Swizzling召川? 字面上意思:方法調(diào)和,也就...
    大大盆子閱讀 1,252評論 0 4
  • Method Swizzling 發(fā)布于:2014-02-25 10:44閱讀數(shù): http://www.coco...
    不要虛度美好的時光閱讀 285評論 0 0
  • Method swizzling指的是改變一個已存在的選擇器對應(yīng)的實(shí)現(xiàn)的過程胸遇,它依賴于Objectvie-C中方法...
    Visitor閱讀 149評論 0 0