Objective-C swizzled 方法未接收参数
Objective-C swizzled method not receiving arguments
我正在开发一个需要执行一些 swizzling 的应用程序。
我正在将一种方法 -(void)m1:(CMAcceleration)a;
与我提供的另一种方法混合使用。
-(void)newM(id self, SEL _cmd, ...){
va_list args;
va_start(args, _cmd);
//...
NSInteger returnValue=((NSInteger(*)(id,SEL,...))origImp)(self,_cmd,args);
va_end(args);
}
为了混合它,我使用:
origImp=method_setImplementation(method, newImp);
然后我通常称它为 [ClassInstance m1:a];
问题是,当我期望 here 中描述的像 {name=type...}
这样的结构时,args 似乎充满了垃圾。
我需要在执行一些像 NSLog 这样的操作后将参数传递给原始实现。
在互联网上搜索这似乎是一个与模拟器相关的问题,但我不确定,而且我无法访问设备来确认这一点。
我是不是做错了什么或者有办法解决这个问题吗?
你做的很不对。
方法签名应该匹配,即 -(void)newM:(CMAcceleration)a;
和
Method method = class_getInstanceMethod([SomeClass class],@selector(newM:));
IMP newImp = method_getImplementation(method);
origImp=method_setImplementation(method, newImp);
另一种方法是创建 C 函数
void newM(id self, SEL _cmd, CMAcceleration a) {
}
origImp=method_setImplementation(method, (IMP)newM);
我正在开发一个需要执行一些 swizzling 的应用程序。
我正在将一种方法 -(void)m1:(CMAcceleration)a;
与我提供的另一种方法混合使用。
-(void)newM(id self, SEL _cmd, ...){
va_list args;
va_start(args, _cmd);
//...
NSInteger returnValue=((NSInteger(*)(id,SEL,...))origImp)(self,_cmd,args);
va_end(args);
}
为了混合它,我使用:
origImp=method_setImplementation(method, newImp);
然后我通常称它为 [ClassInstance m1:a];
问题是,当我期望 here 中描述的像 {name=type...}
这样的结构时,args 似乎充满了垃圾。
我需要在执行一些像 NSLog 这样的操作后将参数传递给原始实现。
在互联网上搜索这似乎是一个与模拟器相关的问题,但我不确定,而且我无法访问设备来确认这一点。
我是不是做错了什么或者有办法解决这个问题吗?
你做的很不对。
方法签名应该匹配,即 -(void)newM:(CMAcceleration)a;
和
Method method = class_getInstanceMethod([SomeClass class],@selector(newM:));
IMP newImp = method_getImplementation(method);
origImp=method_setImplementation(method, newImp);
另一种方法是创建 C 函数
void newM(id self, SEL _cmd, CMAcceleration a) {
}
origImp=method_setImplementation(method, (IMP)newM);