2015-04-27 20 views
0

Objective-C中使用Swizzling。为方便起见,我们使用CoconutKit的辅助方法来实现这一目标:Swizzling - 在Objective-C中使用Swizzling的撤消方法选择器iOS

HLSSwizzleSelectorWithBlock_Begin([TMObjectCache class], @selector(objectForKey:)) 
    ^(TMObjectCache *self, NSString *key) { 
     key = nil; 
     return ((id (*)(id, SEL, NSString*))_imp)(self, _cmd, key); 

    } 
HLSSwizzleSelectorWithBlock_End; 

我们想然而,也未调配后的代码某种意义上说,这一方法。有没有办法做到这一点?

回答

2

我对CoconutKit并不熟悉,但调味只是致电method_exchangeImplementations()。该函数交换两个实现。所以如果你用相同的参数再次调用它,你会交换实现。您需要查看HLSSwizzleSelectorWithBlock_Begin如何建立对method_exchangeImplementations()的呼叫并重新创建。

当然,插入所有标准警告,这些警告是非常危险,脆弱的,主要用于调试,如果还有其他解决方案,应该在生产代码中强烈避免。

+0

“混乱是令人难以置信的危险,脆弱,主要用于调试,应在生产代码中强烈避免”除非Cocoa会高兴地将它背在背后。 :( – matt

+1

是的;但是做KVO的人可以访问源代码,并且所有的苹果开发者都知道不会打破KVO,他们对于你的swizzles没有同样的担心(当然KVO是isa-swizzling,而不是方法 - 你知道一个苹果应用的方法 - 我忘记了吗?) –

+0

我认为KVO是我想到的主要方法;正如你所说,它不是方法混合,但我仍然认为它怀疑(虽然我不得不使用它) – matt