NSNotificationCenter 触发SEGV_ACCERR崩溃

iOS8中,没有移除观察者,即在添加观察者的类中(UIView中,VC不会),没有添加以下代码

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:kAreaChangedNotification object:nil];
}

会在postNotificationName的时候,发生崩溃。因为在iOS8的时候,观察者是unsafe_unretained引用。
unsafe_unretainedweak引用的区分

unsafe_unretained: 不会对对象进行retain,当对象销毁时,会依然指向之前的内存空间(野指针)

weak: 不会对对象进行retain,当对象销毁时,会自动指向nil.

所以,在iOS8中,观察者必须在释放之前从通知中心移除,否则通知中心就会给野指针所引用的对象发送消息,导致程序崩溃。移除的最好是将通知名称带上,防止将系统通知的观察者也移除了。
iOS9之后,观察者是weak引用,不用移除也不会出现崩溃。

你可能感兴趣的:(NSNotificationCenter 触发SEGV_ACCERR崩溃)