0

我们在 Objective-C 中使用 Swizzling。为方便起见,我们使用 CoconutKit 的辅助方法来实现:

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

    }
HLSSwizzleSelectorWithBlock_End;

然而,我们还想在代码中的某个点之后取消调整此方法。有没有办法做到这一点?

4

1 回答 1

2

我不熟悉 CoconutKit,但 swizzling 只是对method_exchangeImplementations(). 该函数交换了两个实现。因此,如果您使用相同的参数再次调用它,您将交换实现。您需要查看如何HLSSwizzleSelectorWithBlock_Begin建立它的调用method_exchangeImplementations()并再次调用它。

当然,插入所有标准警告,即 swizzling 非常危险、脆弱,主要用于调试,如果有任何其他可能的解决方案,应在生产代码中强烈避免。

于 2015-04-27T14:59:53.787 回答