具体问题介绍:
在一个控制器里面设置一个代理,push到子控制器中,子控制器同样设置了相同的代理方法,导致pop回来过后,代理中的respondsToSelector找不到相应的代理方法,此问题是接收不到代理的回调方法导致的
[****ViewController respondsToSelector:]: message sent to deallocated instance
参考博客,自己动手解决了,博客地址:
http://blog.sina.com.cn/s/blog_6707d8b301013e15.html
博客的原因解析:
某个公共类或系统提供的控件,存在delegate方法,当创建此公共控件的容器类已经销毁,
而这个控件对应的服务是在其它run loop中进行的,控件销毁或者需要进行状态通知时,依然按照
delegate的指针去通知,则会出现这个问题。
主要解决方式:
//在viewDidAppear或者viewWillAppear中设置本控制器成为代理
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
_tool = [[Tool alloc]initWithDelegate:self];
}
//push到子控制器中,移除
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
_tool = [[Tool alloc]initWithDelegate:nil];
}
相同的处理方式在子控制器中:
//在viewDidAppear或者viewWillAppear中设置本控制器成为代理
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
_tool = [[Tool alloc]initWithDelegate:self];
}
//pop回到父控制器中,移除
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
_tool = [[Tool alloc]initWithDelegate:nil];
}
网友评论