Я использую стандартный метод swizzling на устройствах ARMv7 IOS, и он отлично работает для меня.
Но когда я компилирую свой код для arm64 - он не может вызвать исходный метод из нового метода
Основная цель моей махинации - использовать параметр из внутреннего метода моего приложения в другом методе.
У меня есть оригинальный метод -(void)insertdata:(id)text
, и я хочу изменить его на -(void)patchedCall:(id)text
и вызвать оригинальный метод в новом методе.
Код:
static IMP sOriginalImp = NULL;
@interface TextOverrides: NSObject
+(void)load;
-(void)patchedinsert:(id)text;
@end
@implementation TextOverrides
+(void)load
{
//Get Implementation of original method
Class originalClass = NSClassFromString(@"DataViewController");
Method originalMeth = class_getInstanceMethod(originalClass, @selector(insertdata:));
//Save original method implementation
sOriginalImp = method_getImplementation(originalMeth);
// Get implementation of replacement method
Method replacementMeth = class_getInstanceMethod(NSClassFromString(@"TextOverrides"), @selector(patchedCall:));
//Replace methods
method_exchangeImplementations(originalMeth, replacementMeth);
}
-(void)patchedCall:(id)text
{
@synchronized(self){
//Call of original method that we save
sOriginalImp(self, @selector(insertdata:), text);
//Make our code for argument "text"
printf("Here is data%s\n", [text UTF8String]);
}
}
@end
Код не работает при вызове оригинального метода на архитектуре arm64:
//Call of original method that we save
sOriginalImp(self, @selector(insertdata:), text);
Как я могу улучшить свой код, чтобы он работал как на armv7, так и на arm64?