【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です.
三、他にもパッケージされたMethod Swizzling拡張をお勧めします.jrswizzle
一、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