[XXXViewController respondsToSelector:]: message sent to deallocated instance

释放双眼,带上耳机,听听看~!

应用直接崩溃且没有任何有效的提示,打断点也看不到断在哪里,只有在 log 中输出下面一句:

*** -[XXXViewController respondsToSelector:]: message sent to deallocated instance 0x18120c80

很明显这是因为一个 UIViewController 释放后,又再次向这个
UIViewController 调用了某些方法导致。

而且根据 log 发现该 UIViewController 是执行了 dealloc 方法,这就说明可能是在 UIViewController 中设置了 xxx.delegate=self,当 UIViewController 释放后,这个 xxx 还没有被释放,所以 xxx 的回调方法还在调用 delegate 即这里的 UIViewController,所以崩溃就发生了。

解决办法是在 dealloc 中设置 xxx.delegate = nil 即可。

—— —— 分割线 —— ——

我遇到这个 crash 是在当前 UIViewController 中, 设置了一个scrollView.delegate = self, 而这个 scrollview 上放置了 textfield。

当 textfield 的键盘向下关闭时,则需要调整 scrollview 的
contentOffset,而当 scrollview 调整时,又会调用 delegate,让其判断是否触发了下拉刷新等操作。

上面有流程在正常情况下是没有问题,但是如果当前的 textfield 处于 focus状态,即键盘弹起的状态,然后点击返回按钮,使当前
UIViewController 被pop出去, 这个时候首先会触发 textfield 的
resignKeyboard 操作,resignKeyboard 方法中又会去重设
scrollview 的 contentOffset,设置 scrollview 的 contentOffset 时,会不断触发其 delegate 即 UIViewController 的调用, 而 UIViewController 已经被释放,所以就出现了崩溃。

当然,上面的情况也可以是当 scrollView 调整时,会调起
scrollViewWillBeginDragging 方法,而在这个方法中,通常会把
textfield 失去焦点,而失去焦点的过程中,又会重新调整
scrollView 的 contentoffset。

人已赞赏
iOS文章

iOS数据持久化 归档NSKeyedArchiver(NSCoding)

2020-1-4 14:30:41

iOS文章

iOS 9更新之Safari广告拦截器的讲解

2020-1-4 15:28:49

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索