【问题标题】:Swizzling - Undo method selector swizzling in Objective-C iOSSwizzling - 在 Objective-C iOS 中撤销方法选择器
【发布时间】:2015-04-27 14:55:54
【问题描述】:

我们在 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;

不过,我们也希望在代码中的某个点之后取消调配此方法。有没有办法做到这一点?

【问题讨论】:

    标签: ios objective-c uikit selector swizzling


    【解决方案1】:

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

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

    【讨论】:

    • "swizzling 非常危险,脆弱,主要用于调试,在生产代码中应该强烈避免" 除了 Cocoa 会很乐意在你背后对你做这件事。 :(
    • 是的;但是使用 KVO 的人可以访问源代码,而且所有 Apple 开发人员都知道不要破坏 KVO。他们对你的调酒没有同样的担心。 (当然 KVO 是 isa-swizzling,而不是 method-swizzling。你知道我忘记的 Apple 应用的 method-swizzle 吗?)
    • 我认为 KVO 是我的主要想法;正如你所说,这不是方法混搭,但我仍然怀疑它(尽管我不得不使用它)。
    • 这个答案不完整。 Swizzling 没有必要使用method_exchangeImplementations。事实上,当它时会更好。 blog.newrelic.com/2014/04/16/right-way-to-swizzle
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2015-07-02
    • 2023-03-20
    相关资源
    最近更新 更多