attempting to detach while still running code
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
attempting to detach while still
running code
在编写代码时,我们时常会遇到一个看似无解的问题,那就是“attempting to detach while still running code”。
这个错误提
示信息一般会伴随着应用程序的崩溃而出现,如果不了解其根本原因,那么修复起来会相当地棘手。
下面来详细介绍一下如何解决这个问题。
1. 确認出错的地方。
首先我们需要寻找错误发生的位置,因为即使出现了同样的错误,背后的原因可能是非常不同的,定位出错位置能够让我们更好地进行
排除。
通常情况下,错误的描述会告诉我们什么函数触发了错误。
不过
这可能会令我们不知所措。
但是我们可以在 Xcode的调试器中清楚地
看到根源。
于是打开Xcode,打开“调试导航器” (Debug Navigator),把注意力放在调试器控制台 (Debugger Console) 的输出信息上。
在
控制台中,我们就能看到堆栈跟踪,同时也能看到错误信息。
2. 不要使用弃用的 View Controller 生命周期方法(Deprecated methods)。
我们都知道,在iOS7之前,UIViewController 的 life cycle
方法如下:
viewWillAppear 、viewDidAppear、viewWillDisappear、viewDidDisappear
但是,iOS7 之后,这些方法都被打上了“已弃用(Deprecated)”的标志。
取而代之的是:
viewWillAppear:animated 、viewDidAppear:animated、viewWillDisappear:animated、viewDidDisappear:animated 如果你的代码中还在使用已经被弃用的方法,那么就会产生“attempting to detach while still running code”这样的错误。
3.不要让一个操作列表在忙时被多次响应。
有时候我们会处理一个有响应的操作状态列表,用户很容易多次触发某项操作,导致尚未响应的操作违反了生命周期规则。
“Attempt to present UIManagerViewController on UINavigationController whose view is not in the window hierarchy”也就不可避免地发生了。
我们可以通过将按钮或表单元素的交互性设置为 false ,以避免多次提交操作。
4. 解决添加等待时间过长
解决等待时间过长的方法是,在等待期间为调用方提供一些反馈。
在 iOS中,通过添加Activity View 或 Progress View等组件,向用户提供一些有用的动态信息,可以避免程序阻塞而出现错误。
5.保持生命周期的一致性
在使用各种操作UI组件时(如UITabBar和UINavigationController),确保每个 ViewController 的生命周期都按照正确的方法调用。
如果程序依赖于这些完全不同的ViewController 生命周期方法调用(包括子视图的方法调用),那么还是会产生“ Attempt to present … whose view is not in the window hierarchy”这样的错误。
综上所述,我们可以采取多种方法来防止“attempting to detach whil e still running code”这个错误的产生,既可以从程序逻辑上进行调整,也可以从UI表现上进行调整。
了解根本原因,我们就能够知道该如何去解决它。
事实上,Xcode的调试器为我们提供了非常便利的调试信息,我们在用程序时也应该做到更多的寻求帮助,调试器就是一个非常好的朋友。