0

我正在开发一个需要执行一些 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]; 的结构时,args 似乎充满了垃圾。在进行了一些类似 NSLog 的操作后,我需要将参数传递给原始实现。{name=type...}

在互联网上搜索,这似乎与模拟器问题有关,但我不确定,我无法访问设备来确认这一点。

我做错了什么还是有办法解决这个问题?

4

1 回答 1

1

你这样做非常错误。

方法签名应该匹配,即-(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);
于 2015-12-13T21:18:26.750 回答