[XXXViewController respondsToSel
应用直接崩溃且没有任何有效的提示,打断点也看不到断在哪里,只有在 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。