最近项目中处理kvo 的时候,遇到一个问题:当我操作的时候,会发现kvo 释放的时候,会崩溃, 崩溃日志如下:
/*Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <SecondViewController 0x7f83d8f30a50> for the key path "kvoState" from <AppDelegate 0x7f83d8c067b0> because it is not registered as an observer.'*/
经过反复研究,发现了错误的原因,并且找到解决错误的办法
下面我将介绍一下我的思路:(慢慢来 跟着我的思路走)
1.我在AppDelegate里面添加一个属性
@property(nonatomic,copy)NSString *kvoState;/* 测试kvo设置的一个字段 */
- (void)monitorNet
{
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
// kvo监听属性值的改变
[appDelegate addObserver:self forKeyPath:@"kvoState" options:NSKeyValueObservingOptionNew context:nil];
}
/**
* kvo
*/
- (void)observeValueForKeyPath:(NSString *)keyPath // 监听的属性名称
ofObject:(id)object // 被监听的对象
change:(NSDictionary *)change // 属性的值
context:(void *)context // 添加监听时传来的值
{
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
if ([keyPath isEqualToString:@"kvoState"]) {
NSNumber *number = [change objectForKey:@"new"];
NSInteger item = [number integerValue];
NSLog(@"%@====",appDelegate.kvoState);
NSLog(@"%@----",number);
if ([object isKindOfClass:[AppDelegate class]] ) {
}
}
}
然后我再去释放 复写系统 dealloc 这个方法
-(void)dealloc
{
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate removeObserver:self forKeyPath:@"kvoState"];
}
TestViewController)里面,然后在TestViewController里面,点击button ,在这个button 的点击事件里面去执行下面的代码:(特地演示错误)
-(void)buttonAction{
SecondViewController *secondVC = [[SecondViewController alloc]init];/*执行此行代码回报上述的错误*/
[self.navigationController popViewControllerAnimated:YES];
}
-(void)dealloc
{
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate removeObserver:self forKeyPath:@"