Objective-C method_exchangeImplementations不起作用

时间:2014-03-16 17:40:28

标签: ios objective-c

我正在尝试使用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;
    }

2 个答案:

答案 0 :(得分:2)

-upperCaseString是一个实例方法,而不是类方法。所以你在这里打电话:

Method swappedMethod = class_getClassMethod([NSString class], @selector(uppercaseString));

可能会返回零。当其中一个参数为零时,我不确定method_exchangeImplementations会做什么,但它可能不是你在任何情况下所希望的。

答案 1 :(得分:0)

我有类似的问题。 选择器无效,我不得不添加.class电话。

class_getClassMethod(self.class, @selector(imageNamed:));