2017-06-26 4 views

Antwort

0

Ich denke, dass es mit einem "hacky" Weg möglich ist: Swizzling verwenden, um die NSNotificationCenter.addObserver Methode zu beobachten.

@implementation NSNotificationCenter (Swizzling) 

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

     SEL originalSelector = @selector(addObserver:selector:name:object:); 
     SEL swizzledSelector = @selector(swizzling_addObserver:selector:name:object:); 

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

     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)swizzling_addObserver:(id)observer selector:(SEL)aSelector name:(NSNotificationName)aName object:(id)anObject { 
    //implement code here to store all notifications. 

    //then call original method (read in the link below to understand why we call **swizzling_addObserver** but not **addObserver** 
    [self swizzling_addObserver:observer selector:aSelector name:aName object:anObject]; 
} 

Um mehr über Swizzling lernen Sie diesen Artikel lesen können: http://nshipster.com/method-swizzling/

0

Sie es durch Parsen [[NSNotificationCenter defaultCenter] debugDescription] und die Suche nach Objektadressen tun könnte:

  • Namen, Objekt, Beobachter, Optionen
  • NSWindowWillEnterFullScreenNotification, 0x7fffb685e8e0, 0x6000001003f0, 1400
  • _NSWindowDidChangeContentsHostedInLayerSurfaceNotification, 0x7fffb685e8e0, 0x6180000a4680, 1400
  • NSAntialiasThresholdChangedNotification, 0x7fffb685e8e0, 0x6080001e0300, 1400
  • kCFLocaleCurrentLocaleDidChangeNotification, 0x7fffb685e8e0, 0x7fffb685e9c0, 1001
  • some_string, 0x7fffb685e8e0, 0x600000000210, 1400
  • ...
Verwandte Themen