Notification、KVO实现代码

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. 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值