NSNotificationCenter|NSNotificationCenter 触发SEGV_ACCERR崩溃
【NSNotificationCenter|NSNotificationCenter 触发SEGV_ACCERR崩溃】iOS8中,没有移除观察者,即在添加观察者的类中(UIView中,VC不会),没有添加以下代码
- (void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self name:kAreaChangedNotification object:nil];
}
会在
postNotificationName
的时候,发生崩溃。因为在iOS8的时候,观察者是unsafe_unretained
引用。unsafe_unretained
和weak
引用的区分unsafe_unretained: 不会对对象进行retain,当对象销毁时,会依然指向之前的内存空间(野指针)weak: 不会对对象进行retain,当对象销毁时,会自动指向nil.
所以,在iOS8中,观察者必须在释放之前从通知中心移除,否则通知中心就会给野指针所引用的对象发送消息,导致程序崩溃。移除的最好是将通知名称带上,防止将系统通知的观察者也移除了。
iOS9之后,观察者是
weak
引用,不用移除也不会出现崩溃。推荐阅读
- 【Flink】Flink手动触发savepoint失败问题
- 2019年1月28日|2019年1月28日 触发点
- 点击触发事件和JS触发事件在EventLoop上的区别
- 从Vue3.0的watchEffect没有触发ref数组变化说起
- Web前端基础(08)
- javascript|关于input的change事件触发多次发解决
- 手机端禁止手指滑动屏幕触发点击事件
- disabled与tap(input的disabled='disabled'时tap事件任可触发)
- Android|Android系统下如何通过外设实现GPIO中断触发调用Android程序执行
- Mysql|MySQL数据库触发器讲解与案例