2015-12-13 2 views
0

Я разрабатываю приложение, которое должно выполнять некоторые swizzling. Я изучаю метод -(void)m1:(CMAcceleration)a; с другим, который я предоставляю.Objective-C swizzled method, не получающий аргументы

-(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); 
} 

Чтобы Swizzle его я использую:

origImp=method_setImplementation(method, newImp); 

Я тогда называть это нормально, как [ClassInstance m1:a]; Дело в том, арг, кажется, заполнен мусором, когда я ожидал структуру, подобную {name=type...}, как описано в here , Мне нужно передать аргументы исходной реализации после выполнения некоторой операции, например NSLog.

Поиск в Интернете кажется, что это проблема с симулятором, но я не уверен, и у меня нет доступа к устройству, чтобы подтвердить это.

Я делаю что-то неправильно или есть способ исправить это?

+0

Что вам «арг, кажется, заполнен мусором «? Покажите код, который вы использовали для его определения. Что вы имеете в виду, что вы «ожидали такую ​​структуру, как' {name = type ...} '?? Покажите код, как вы ожидали, чтобы использовать аргументы, как вы ожидали, что он будет вести себя, и как он себя ведет. Также покажите пример вызова метода. –

+0

@KenThomases Я его отредактировал, надеюсь, что это поможет –

ответ

1

Вы делаете это очень неправильно.

Метод подписи должен соответствовать, т.е. -(void)newM:(CMAcceleration)a;

и

Method method = class_getInstanceMethod([SomeClass class],@selector(newM:)); 
IMP newImp = method_getImplementation(method); 
origImp=method_setImplementation(method, newImp); 

Другой способ, это сделать функцию С

void newM(id self, SEL _cmd, CMAcceleration a) { 

} 

origImp=method_setImplementation(method, (IMP)newM); 
+0

Разве нет более общего способа сделать это? Я бы хотел, чтобы моя реализация метода newM использовалась в самых разных методах. –

+0

Нет, если эти методы имеют разные подписи. Если вы не хотите выполнять некоторые низкоуровневые работы (сборки) для создания функции, которая корректно принимает любое количество аргументов. (Вам нужно уважать модификаторы ARC, чтобы избежать сбоя) –

+0

Что вы подразумеваете под «правильно принять любое количество аргументов»? Разве это не те переменные функции аргументов? –

Смежные вопросы