addObserverForName 使用注意事项

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

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

dealloc方法里也习惯添加

[[NSNotificationCenter defaultCenter] removeObserver:self];

来释放监听的对象

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

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

挖坑过程:

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

[[NSNotificationCenter defaultCenter] removeObserver:self];

挖坑效果:

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

填坑攻略:

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

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

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

- (void)dealloc
{    
    if (observer) {
        [[NSNotificationCenter defaultCenter] removeObserver:observer];
    }
}

总结

addObserverForNameaddObserver的释放是不一样。

你可能感兴趣的:(addObserverForName 使用注意事项)