1、通知
监控方:在消息中心中,为Observer(大部分情况是self)增加一个监控,当收到一个name的通知时,执行selector操作。
一般放在ViewDidLoad或者viewWillAppear,后者为佳。
[[NSNotificationCenterdefaultCenter]addObserver:self
selector:@selector(removeView2)
name:@"NotificationName"
object:nil];
取消监控:
[[NSNotificationCenterdefaultCenter]removeObserver:self];
[[NSNotificationCenterdefaultCenter]removeObserver:selfname:@"NotificationName"object:nil]
一般放在dealloc或者viewWillDisappear,后者为佳。
虽然在 IOS 用上 ARC 后,不显示移除 NSNotification Observer 也不会出错(crash),但是这是一个很不好的习惯,不利于性能和内存。
2、KVO
监控方:让Observer去监听self.view2的属性keyPath"clickTimes"的变化,当self.view2.clickTimes发生变化,self就可以知道。
[self.view2addObserver:selfforKeyPath:@"clickTimes" options:NSKeyValueObservingOptionNew context:NULL];
然后在下面的监听方法中处理:
- (void)observeValueForKeyPath:(nullableNSString *)keyPath ofObject:(nullableid)object change:(nullableNSDictionary *)change context:(nullablevoid *)context
取消监听:
[self.view2 removeObserver:self forKeyPath:@"clickTimes"];
不移除会可能产生崩溃:
- (void)testKVO {
PersonObject *personInstance = [[PersonObject alloc] init];
BankObject *bankInstance = [[BankObject alloc] init];
[bankInstance addObserver:personInstance forKeyPath:@"accountBalance" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
bankInstance.accountBalance = 20;
}
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'An instance 0x7fcbb8630180 of class PersonObject
was deallocated while key value observers were still registered with it.