【问题标题】:Method Swizzle on iPhone deviceiPhone 设备上的方法 Swizzle
【发布时间】:2009-10-28 14:28:20
【问题描述】:

我尝试了 JRSwizzle 和 MethodSwizzle。它们在模拟器上编译得很好,但是当我尝试为 Device (3.x) 编译时抛出一堆错误

有没有人在 iphone 上玩过运气?有什么诀窍?

TIA

【问题讨论】:

    标签: iphone objective-c swizzling


    【解决方案1】:

    CocoaDev wiki 对方法调配here 进行了广泛的讨论。 Mike Ash 在该页面底部有一个相对简单的实现:

    #import <objc/runtime.h> 
    #import <objc/message.h>
    //....
    
    void Swizzle(Class c, SEL orig, SEL new)
    {
        Method origMethod = class_getInstanceMethod(c, orig);
        Method newMethod = class_getInstanceMethod(c, new);
        if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
            class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
        else
        method_exchangeImplementations(origMethod, newMethod);
    }
    

    我没有对此进行测试,只是因为我认为方法调配是一个极其危险的过程,并且还没有使用它的必要。

    【讨论】:

    • 感谢工作。他们使用它的关键是#import #import
    • @funkybro - 感谢您指出这一点。在它被删除之前,我挖出了该页面的存档版本。 wiki 恢复后,我将替换存档链接。
    • +1 表示 * swizzling 是一个极其危险的过程,还没有必要使用它。*
    • Swizzling 在构建用于单元测试的模拟框架时非常有用。
    • +1 @odyth 表示它对单元测试很有用。我正在将方法 swizzling 与 OCMock 结合起来,对 NSURLConnection 对服务器的请求和来自服务器的响应进行单元验证。 Swizzling 让我们可以轻松地进行此类验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多