[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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 7,311评论 1 14
  • 1.badgeVaule气泡提示 2.git终端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夹内容...
    i得深刻方得S阅读 10,215评论 1 9
  • 172.简述视图控制器的生命周期。 1)init函数(init;initWithFrame;initWithCod...
    AlanGe阅读 2,967评论 0 0
  • 文/向光的小虫 第一章、离别是迎接下一个你的到来 小白再次看到那个熟睡的脸庞已经时隔一个月零五天了,从起初认识樱樱...
    向光的小虫阅读 3,688评论 0 2
  • 从梦中醒来,觉得一点都不真实。居然梦见她怀孕了,还是和那个男生的,颠覆了我的三观。我在梦中哭的声嘶力竭,后悔不已,...
    96line_9阅读 929评论 0 0