addObserverForName 使用注意事项

避免使用addObserverForName方法给自己埋坑

挖坑准备工作

之前使用通知喜欢直接在viewDidLoad里面添加下面方法

1
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSString *)aName object:(nullable id)anObject;

dealloc方法里也习惯添加

1
[[NSNotificationCenter defaultCenter] removeObserver:self];

来释放监听的对象

但是这种方法不是很直观,所以后来想用通知的block方法,由于使用不规范,埋下了很多坑,现在来填坑。先说下坑在哪里,通知的block方法如下:

1
- (id <NSObject>)addObserverForName:(nullable NSString *)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block

挖坑过程

viewDidLoad直接使用上述block方法,不接收其返回值,在dealloc方法里面只添加

1
[[NSNotificationCenter defaultCenter] removeObserver:self];

挖坑结果

发出一个通知,可以接收到多次

填坑攻略

我还是用代码来展示吧,先定义一个 id 对象 observer 用来接收block方法的返回值

1
2
3
4
observer = [[NSNotificationCenter defaultCenter] addObserverForName:@"notificationName" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
// do anything
}];

释放的时候直接removeObserver:self是没有效果的,而应该使用下列方法

1
2
3
4
5
6
- (void)dealloc
{
if (observer) {
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}
}

总结

addObserverForNameaddObserver的释放是不一样。

Jackson wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
如果你觉得我的文章还不错,欢迎打赏~