在运行时无法交换NSDictionary的方法实现objectForKey?

时间:2014-05-22 15:50:14

标签: ios objective-c runtime nsdictionary

我尝试在运行时使用NSDictionary的objectForKey:交换实现,但没有任何改变!

#import "NSDictionary+Utils.h"
#import <objc/runtime.h>

@implementation NSDictionary (Utils)

+ (void)load
{
    method_exchangeImplementations(class_getInstanceMethod(self, @selector(objectForKey:)),
                                   class_getInstanceMethod(self, @selector(_objectForKey:)));
}

- (id)_objectForKey:(id)aKey
{
    NSLog(@"ok");
    id obj = [self _objectForKey:aKey];
    if ([obj isEqual:[NSNull null]]) {
        return nil;
    }
    return obj;
}

@end

谁能告诉我为什么?

感谢您阅读我糟糕的英语。

2 个答案:

答案 0 :(得分:6)

NSDictionary是一个类集群。你永远不会处理NSDictionary的直接实例;相反,字典总是某些NSDictionary子类的实例。所以你要交换一个你永远不会打电话的方法。

答案 1 :(得分:0)

对于您要实现的目标,我建议在NSDictionary上使用一个类别,提供自定义saveObjectAtIndex:方法并在您的代码中使用它。

另一个选项是NSNull上的类别,所以它的行为类似于nil:https://gist.github.com/ronaldmannak/4532707