我正在尝试使用objc运行时库来交换方法实现。我有这个简单的例子但它似乎不起作用(实现没有交换)。我忘记了什么?
#import "AppDelegate.h"
#import "MainViewController.h"
#import <objc/runtime.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//lowercase NSString Method
Method originalMethod = class_getInstanceMethod([NSString class], @selector(lowercaseString));
//uppercase NSString Method
Method swappedMethod = class_getClassMethod([NSString class], @selector(uppercaseString));
//swap em
method_exchangeImplementations(swappedMethod, originalMethod);
NSLog(@"%@",[@"test" lowercaseString]); //OUTPUT: test !!
...
return YES;
}
答案 0 :(得分:2)
-upperCaseString
是一个实例方法,而不是类方法。所以你在这里打电话:
Method swappedMethod = class_getClassMethod([NSString class], @selector(uppercaseString));
可能会返回零。当其中一个参数为零时,我不确定method_exchangeImplementations
会做什么,但它可能不是你在任何情况下所希望的。
答案 1 :(得分:0)
我有类似的问题。
选择器无效,我不得不添加.class
电话。
class_getClassMethod(self.class, @selector(imageNamed:));