0

NSMutableDictionaryをうろつそうとしています。私はここで間違って何をしていますか? NSMutableDictionaryのsetObject:forKey:をオーバーライドしようとしています。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

私はこの種の仕事を思いついた最後の時間、私は[[必要なデバイスからのnilオブジェクトを挿入しようとする方法をキャッチする方法についてのアドバイス](http://stackoverflow.com/a/23789405/1492173) 。 –

答えて

5

NSMutableDictionaryclass clusterです。実際の作業を実装する多数のApple固有の具象サブクラスの抽象基本クラスです。サブクラスとしては、-setObject:forKey:をオーバーライドします。 NSMutableDictionary自体にそのメソッドの実際の実装はなく、何も呼び出そうとしません。したがって、置換実装を呼び出すものはありません。

0

それがうまくいかない理由を伝えた後: - (void)setObject:(id)objectまたはNullForKey:(NSString *)キーのようにNSMutableDictionaryに新しいメソッドを追加するだけです。

おそらくもっと有用なのは、オブジェクトが追加されていない場合や削除されていない場合もあります。そうすれば、objectForKeyは渡されたものと同じnilを返します。

関連する問題