Method Swizzling

Method Swizzling是runtime應(yīng)用的體現(xiàn),那么關(guān)于Method Swizzling的應(yī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)計;比如為了統(tǒng)計viewwillappear調(diào)用的次數(shù),我們可以在基類(其他VC繼承的類)的VC里面,添加如下代碼就可以統(tǒng)計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注意事項

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

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容