0

Я пытаюсь swizzle NSMutableDictionary. Что я здесь делаю неправильно? Я пытаюсь переопределить setObject: forKey: для NSMutableDictionary.Swizzled метод для NSMutableDictionary не называется

#import "NSMutableDictionary+NilHandled.h" 
#import <objc/runtime.h> 


@implementation NSMutableDictionary (NilHandled) 

+ (void)load{ 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     Class class = [self class]; 

     SEL originalSelector = @selector(setObject:forKey:); 
     SEL swizzledSelector = @selector(swizzledSetObject:forKey:); 

     Method originalMethod = class_getInstanceMethod(class, originalSelector); 
     Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); 

     class_replaceMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); 

     BOOL didAddMethod = class_addMethod(class,originalSelector,method_getImplementation(swizzledMethod),method_getTypeEncoding(swizzledMethod)); 
     if (didAddMethod) { 
      class_replaceMethod(class,swizzledSelector,method_getImplementation(originalMethod),method_getTypeEncoding(originalMethod)); 
     } else { 
      method_exchangeImplementations(originalMethod, swizzledMethod); 
     } 
    }); 
} 

- (void) swizzledSetObject:(id)anObject forKey:(id<NSCopying>)aKey 
{ 
    [self swizzledSetObject:anObject?anObject:@"Nil" forKey:aKey]; 
} 

@end

+2

Помимо вещей, которые не работают, замена значений nil на «Nil» - очень и очень плохая идея. [NSNull null] предназначен для использования именно для этой цели. – gnasher729

+0

В прошлый раз, когда я придумал такую ​​задачу, я последовал за [попыткой уловить попытку вставить нулевой объект «с необходимого устройства») (http://stackoverflow.com/a/23789405/1492173). , –

ответ

5

NSMutableDictionary является class cluster. Это абстрактный базовый класс для ряда ядро-частных подклассов, которые реализуют настоящую работу. В качестве подклассов они переопределяют -setObject:forKey:. Реальной реализации этого метода не существует на самом NSMutableDictionary, и ничто не пытается его назвать. Поэтому ничто не вызывает вашу замену.

0

После того, как выясняется, почему это не работает: просто добавьте новый метод к объекту NSMutableDictionary, например - (void) setObject: (id) или ключ NullForKey: (NSString *).

Возможно, более полезным является метод, который не пытается добавить или даже удалить объект, если он равен нулю. Таким образом, objectForKey вернет нуль, то же самое, что вы прошли.