【iOS開発】Method Swizzling

1397 ワード

参考記事:iOSブラックマジック-Method Swizzling
一、Method Swizzlingとは何ですか.NSObjectに継承されたクラスごとにruntimeのサポートが自動的に得られます.このようなクラスでは、コンパイラによってコンパイルするときにクラス(NSObjectに継承する必要がある)のために作成されるisaポインタがクラス定義データ構造体を指す.この構造体には、その親クラスの定義を指すポインタおよびDispatch tableが含む.Dispatch tableはSELとIMPの対応表です.method swizzlingは,このdispathc tableテーブルを修正することによってSEL対応のIMPを修正し,メソッド実装の修正を実現する.
[手軽に学ぶIMPポインタの役割](http://ww w.cocoachina.com/ios/20150717/12623.html)iOSのSElとIMPはいったい何なのか
二、どのように使いますか.NSMutableArrayのaddObjectメソッドを再実装し、追加したobjがnilの場合もクラッシュしないようにするためにNSArrayに書かれた小さなdemoです.
+ (void)load
{
    [super load];
    Method originMethod = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(addObject:));
    Method realMethod = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(swizzling_addObject:));
    method_exchangeImplementations(originMethod, realMethod);

}

// , , 
- (void)swizzling_addObject:(id)obj
{
    if (!obj) {
        @try{
            [self swizzling_addObject:obj];
        }
        @catch (NSException *exception){
            NSLog(@"---------- %s Crash Because Method %s  ----------
", class_getName(self.class), __func__); NSLog(@"%@", [exception callStackSymbols]); } @finally {} }else{ [self swizzling_addObject:obj]; } }

三、他にもパッケージされたMethod Swizzling拡張をお勧めします.jrswizzle