这里有完整的答案:
我查看了您的应用程序,我认为 UINavigationController 和异步 http 加载在两个地方的组合存在问题。启用僵尸确实揭示了这两个错误。我能够重现的第一个,第二个弹出几次,然后不再出现。
*** -[DetailViewController respondsToSelector:]: message sent to deallocated instance 0x56d6030
*** -[SearchViewController respondsToSelector:]: message sent to deallocated instance 0x56daa10
我刚刚限制了我的带宽以查看这些错误是否与 http 请求有关。查看 [Throttling Bandwidth On A Mac][1] 设置慢速连接。我将其设置为 5KBytes/秒。
如果您非常快速地查看详细信息,然后再次上两级并作为触发错误的最后一个操作:单击搜索,则会出现第一个错误。堆栈跟踪显示了一个
#2 0x004545b8 in -[UIWebView webView:decidePolicyForMIMEType:request:frame:decisionListener:]
并且有一些线程打开,所以查看下拉列表,有一个 webThread。显示该线程揭示了加载 detailPages url 的 web 视图正在发生的事情。这暗示 webiew 实际上已在单独的线程中完成加载,并且无法连接回 webview 本身 [DetailViewController respondsToSelector:]。这很容易证明:删除 webview 请求的加载:我无法重现错误。
解决问题1
这个问题很容易解决,因为 webview 没有在 dealloc 中释放。还建议将委托设置为 nil 个对象,但在这种情况下不需要。
- (void)dealloc {
webView.delegate = nil;
[webView release];
}
第二个错误
stackTrace 显示了一个
CLLocationManager onClientEventLocation:
解决方法错误
同错误1,将delegate设为nil并释放locationManager。
当您的应用程序崩溃时,您无法在左侧窗口中打开调试器,您可以看到堆栈跟踪。您可以双击任何将跳转到代码中正确位置的行(如果调用的方法是您的)。
转到项目->编辑活动可执行文件->参数选项卡
通过单击 +
在下部窗口中添加变量
Name:NSZombieEnabled
Value:YES
这会尝试将内存地址解析为类名,以解决严重的过度错误。
要了解内存泄漏,请打开运行->使用性能工具运行->泄漏。这将打开仪器,这是查找泄漏的绝妙工具。