NSNotificationCenter 是否需要remove

2019-03-26  本文已影响0人  寂寞先森666

第一、__unsafe_unretain

__unsafe_unretain和__weak都能避免retain cycle,但是他们也有一些细微的不同。对于__weak,当释放指针指向的对象时,该对象的指针将转换为nil,这是比较安全的行为。而__unsafe_unretain,正如其名称隐藏的含义,尽管释放指针指向的对象时,该指针将继续指向原来的内存。这将会导致应用crash,所以是unsafe

第二、通知中心对响应者observer是使用unsafe_unretained修饰

当响应者释放会出现野指针,如果向野指针发送消息会造成崩溃。在 iOS9 系统之后,[NSNotificationCenter defaultCenter]会在响应者observer调用-dealloc方法的时候执行-removeObserver:方法

第三、如何证明响应者dealloc时候调用了removeObserver?

写个NSNotificationCenter的 分类 ,拦截removeObserver ,发现当响应者dealloc时候确实调用removeObserver

+ (void)load {

    Methodorigin =class_getInstanceMethod([selfclass],@selector(removeObserver:));

    Methodcurrent =class_getInstanceMethod([selfclass],@selector(_removeObserver:));

    method_exchangeImplementations(origin, current);

}

- (void)_removeObserver:(id)observer {

    NSLog(@"调用移除通知方法: %@", observer);

    //    [self _removeObserver:observer];

}

参考:https://www.jianshu.com/p/e3a38b21420c

上一篇下一篇

猜你喜欢

热点阅读