我需要检查对象是否为NSNotification。仅仅知道它是否是子类是不够的,因为我想区分它是NSNotification还是NSNotification的子类。
因此,为了详细说明,我需要区分以下内容:
问题在于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/