Objective c 方法是否可以在静态库中滑动?

Objective c 方法是否可以在静态库中滑动?,objective-c,logging,automation,click,method-swizzling,Objective C,Logging,Automation,Click,Method Swizzling,我正在尝试创建一个自动的UI日志,我发现方法swizzling是解决这个问题的一个非常好的方法。我尝试过使用ui应用程序实现的sendAction方法 我的问题是它有时有效,有时无效。特别是如果我在静态库中编写代码,请将其导出到.a文件并在项目中使用 如果方法swizzling是在静态库中实现的,那么它应该是一个问题吗 即使在代码中,它有时也能工作,有时什么也不会发生。它总是进入load方法,但不总是进入heap\u sendAction方法 代码如下: #import <objc/run

我正在尝试创建一个自动的UI日志,我发现方法swizzling是解决这个问题的一个非常好的方法。我尝试过使用
ui应用程序
实现的
sendAction
方法

我的问题是它有时有效,有时无效。特别是如果我在静态库中编写代码,请将其导出到.a文件并在项目中使用

  • 如果方法swizzling是在静态库中实现的,那么它应该是一个问题吗

  • 即使在代码中,它有时也能工作,有时什么也不会发生。它总是进入
    load
    方法,但不总是进入
    heap\u sendAction
    方法

  • 代码如下:

    #import <objc/runtime.h>
    
    @implementation UIApplication (EventAutomator)
    
    + (void)load 
    {
        Class class = [self class];
        SEL originalSelector = @selector(sendAction:to:from:forEvent:);
        SEL replacementSelector = @selector(heap_sendAction:to:from:forEvent:);
    
        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method replacementMethod = class_getInstanceMethod(class, replacementSelector);
        method_exchangeImplementations(originalMethod, replacementMethod);
    }
    
    - (BOOL)heap_sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event 
    {
        NSString *selectorName = NSStringFromSelector(action);
        printf("Selector %s occurred.\n", [selectorName UTF8String]);
        return [self heap_sendAction:action to:target from:sender forEvent:event];
    }
    
    @end
    
    #导入
    @应用程序(EventAutomator)的实现
    +(空)荷载
    {
    Class=[self Class];
    SEL originalSelector=@selector(sendAction:to:from:forEvent:);
    SEL replacementSelector=@selector(heap_sendAction:to:from:forEvent:);
    方法originalMethod=class\u getInstanceMethod(class,originalSelector);
    方法replacementMethod=class\u getInstanceMethod(class,replacementSelector);
    方法交换实施(原始方法、替代方法);
    }
    -(BOOL)heap_sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent*)事件
    {
    NSString*selectorName=NSStringFromSelector(操作);
    printf(“出现了选择器%s。\n”,[selectorName UTF8String]);
    返回[self heap_sendAction:action to:target from:sender forEvent:event];
    }
    @结束
    
    -----更新----:

    当我将函数放入viewcontroller.m类中时,会调用heap_sendAction。 我现在正在尝试不同的代码位置,以查看它何时工作,何时不工作。

    来自:

    加载消息将被发送到同时为 动态加载和静态链接,但仅当新加载的 类或类别实现可以响应的方法

    初始化的顺序如下:

  • 链接到的任何框架中的所有初始值设定项

  • 图像中的所有+加载方法

  • <> >所有C++静态初始化器和C++ C/C++ <强>属性< /强>(构造函数)函数在您的映像中。

  • 框架中链接到您的所有初始值设定项

  • 此外:

    • 类的+load方法在其所有超类的+load方法之后调用

    • 在类自己的+load方法之后调用category+load方法

    所以,即使在静态库中,方法swizzling也不是问题,因为此时链接到的框架中的类已经加载<代码>方法\u交换实施应按预期工作。看起来问题出在其他地方。

    来自:

    加载消息将被发送到同时为 动态加载和静态链接,但仅当新加载的 类或类别实现可以响应的方法

    初始化的顺序如下:

  • 链接到的任何框架中的所有初始值设定项

  • 图像中的所有+加载方法

  • <> >所有C++静态初始化器和C++ C/C++ <强>属性< /强>(构造函数)函数在您的映像中。

  • 框架中链接到您的所有初始值设定项

  • 此外:

    • 类的+load方法在其所有超类的+load方法之后调用

    • 在类自己的+load方法之后调用category+load方法


    所以,即使在静态库中,方法swizzling也不是问题,因为此时链接到的框架中的类已经加载<代码>方法\u交换实施应按预期工作。看起来问题出在其他地方。

    正如我提到的,“加载”方法得到了正确的实现,并且始终有效。我的问题是第二部分,有时有效,有时无效。。。我不知道去哪里找虫子。这是一个非常简单的代码块,有什么线索我应该寻找?也许“load”方法中执行的代码在某一点上被过度编写了?正如我所提到的,“load”方法得到了正确的实现,并且始终有效。我的问题是第二部分,有时有效,有时无效。。。我不知道去哪里找虫子。这是一个非常简单的代码块,有什么线索我应该寻找?可能“load”方法中执行的代码在某一点被过度写入?请提供更多信息,说明在哪些情况下调用了
    heap\u sendAction
    ,而在哪些情况下不调用。这完全是随机的吗?点击按钮?当从代码显式调用方法时?其他情况?更新了原始消息。请提供更多信息,说明哪些情况下调用了
    heap\u sendAction
    ,哪些情况下不调用。这完全是随机的吗?点击按钮?当从代码显式调用方法时?其他情况?更新原始消息。