// 接收通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"TestNotification" object:@1]; // 发送通知 [NSNotificationCenter.defaultCenter postNotificationName:@"TestNotification" object:nil];
不能
需要了解通知中心存储通知观察者的结构了,具体如下:
// 根容器,NSNotificationCenter持有 typedef struct NCTbl { Observation *wildcard; /* 链表结构,保存既没有name也没有object的通知 */ GSIMapTable nameless; /* 存储没有name但是有object的通知 */ GSIMapTable named; /* 存储带有name的通知,不管有没有object */ ... } NCTable; // Observation 存储观察者和响应结构体,基本的存储单元 typedef struct Obs { id observer; /* 观察者,接收通知的对象 */ SEL selector; /* 响应方法 */ struct Obs *next; /* Next item in linked list. */ ... } Observation;
nameless与named的具体数据结构如下:
如上图所示,当添加通知监听的时候,我们传入了name和object,所以,观察者的存储链表是这样的:
named表:key(name):value->key(object):value(Observation)
因此在发送通知的时候,如果只传入name而并没有传入object,是找不到Observation的,也就不能执行观察者回调