我需要检查对象是否为NSNotification。仅仅知道它是否是子类是不够的,因为我想区分它是NSNotification还是NSNotification的子类。

因此,为了详细说明,我需要区分以下内容:

  • NSConcreteNotification
  • NSNotification的子类(但不是NSConcreteNotification)

  • 问题在于NSNotifications实际上是NSConcreteNotifications,而NSConcreteNotification是 private 类,因此我无法使用它进行测试。
    [object isMemberOfClass: [NSNotification class]] // returns NO in both cases
    [object isKindOfClass: [NSNotification class]] // returns YES in both cases
    

    最佳答案

    没有理由按照您描述的方式对NSNotification进行子类化。首先,NSNotification已经带有一个userInfo字典。您可以在其中放置任何数据。如果愿意,您可以使用类别方法读写该字典(我一直都这样做)。例如,我想做的一个非常普通的事情是传递一些对象,比如RNMessage。所以我创建了一个看起来像这样的类别:

    @interface NSNotificationCenter (RNMessage)
    - (void)postNotificationName:(NSString *)aName object:(id)anObject message:(RNMessage *)message;
    @end
    
    @interface NSNotification (RNMessage)
    - (RNMessage *)message;
    @end
    
    static NSString * const RNMessageKey = @"message";
    
    @implementation NSNotificationCenter (RNMessage)
    - (void)postNotificationName:(NSString *)aName object:(id)anObject message:(RNMessage *)message {
      [self postNotificationName:aName object:anObject userInfo:[NSDictionary dictionaryWithObject:message forKey:RNMessageKey];
    }
    @end
    
    @implementation NSNotification (RNMessage)
    - (RNMessage *)message {
      return [[self userInfo] objectForKey:RNMessageKey];
    }
    

    如@hypercrypt所述,您还可以使用关联的引用将数据附加到任意对象,而无需创建ivar,但是使用NSNotification,使用userInfo字典要简单得多。使用NSLog打印通知要容易得多。易于序列化。更容易复制它们。等等,关联的引用很好,但是它们确实增加了很多小问题,如果可以避免的话,应该避免使用。

    关于objective-c - NSNotification的测试类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7583414/

    10-10 06:32