Yak*_*kov 5 objective-c objective-c-runtime ios arm64 method-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
Run Code Online (Sandbox Code Playgroud)
在arm64架构上调用原始方法时代码失败:
//Call of original method that we save
sOriginalImp(self, @selector(insertdata:), text);
Run Code Online (Sandbox Code Playgroud)
如何改进我的代码以在armv7和arm64上工作?
我不认为\xe2\x80\x99t 认为所有类的加载顺序都在某处指定。所以可能是该类TextOverrides之前加载过DataViewController,但在armv7上没有加载过。请参阅https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html
为了使其稳定,您应该只在类别 +load 方法中混合方法。例如:
\n\n@interface DataViewController (TextOverrides)\n+(void)load;\n-(void)patchedinsert:(id)text;\n@end\n\n@implementation DataViewController (TextOverrides)\n\n+(void)load\n{\n // swizzle here\n}\n...\nRun Code Online (Sandbox Code Playgroud)\n