Objective c 方法是否可以在静态库中滑动?
我正在尝试创建一个自动的UI日志,我发现方法swizzling是解决这个问题的一个非常好的方法。我尝试过使用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应用程序
实现的sendAction
方法
我的问题是它有时有效,有时无效。特别是如果我在静态库中编写代码,请将其导出到.a文件并在项目中使用
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。
我现在正在尝试不同的代码位置,以查看它何时工作,何时不工作。来自:
加载消息将被发送到同时为
动态加载和静态链接,但仅当新加载的
类或类别实现可以响应的方法
初始化的顺序如下:
- 类的+load方法在其所有超类的+load方法之后调用
- 在类自己的+load方法之后调用category+load方法
- 类的+load方法在其所有超类的+load方法之后调用
- 在类自己的+load方法之后调用category+load方法
所以,即使在静态库中,方法swizzling也不是问题,因为此时链接到的框架中的类已经加载<代码>方法\u交换实施应按预期工作。看起来问题出在其他地方。正如我提到的,“加载”方法得到了正确的实现,并且始终有效。我的问题是第二部分,有时有效,有时无效。。。我不知道去哪里找虫子。这是一个非常简单的代码块,有什么线索我应该寻找?也许“load”方法中执行的代码在某一点上被过度编写了?正如我所提到的,“load”方法得到了正确的实现,并且始终有效。我的问题是第二部分,有时有效,有时无效。。。我不知道去哪里找虫子。这是一个非常简单的代码块,有什么线索我应该寻找?可能“load”方法中执行的代码在某一点被过度写入?请提供更多信息,说明在哪些情况下调用了
heap\u sendAction
,而在哪些情况下不调用。这完全是随机的吗?点击按钮?当从代码显式调用方法时?其他情况?更新了原始消息。请提供更多信息,说明哪些情况下调用了heap\u sendAction
,哪些情况下不调用。这完全是随机的吗?点击按钮?当从代码显式调用方法时?其他情况?更新原始消息。