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ù)。