我2年前写了一个巨大的iPad应用程序,现在我又回到了它并将其升级到iOS5。它有点乱,因为它是我的第一个大型iPad应用程序。
它有一个“同步”步骤可能会持续几分钟,这些是一堆异步方法调用,它们从URL获取JSON并将它们放入核心数据中。通常,应用程序将冻结(UI无响应)。
有什么好的技巧来追踪这种冻结?调试器没有用,因为除非代码在主线程上运行,否则您没有可用的堆栈跟踪。该应用程序通常无法恢复,这表明某种死锁情况。
以下是一个可能有用的特定示例:
我确认它被冻结后暂停了执行。它似乎每次都冻结在同一条线上 - 一个简单的任务。这里发生了什么?它太令人沮丧了。
此核心数据访问是否导致此问题?任何指针都将非常感激。
编辑2012年6月29日
Click here查看执行所有创建/更新/删除Core数据对象的类的源代码。我只需要在这个应用程序中停止冻结/崩溃。我知道它一团糟,它也让我感到畏缩。我2年前写的这篇文章几乎没有任何关于Objective-c的知识。我应该重写它,但我必须在2天内让这个工作完全失控。任何人都可以指点一下快速获得线程安全的方法吗?我可以在Grand Central dispatch block code中包装更新NSManagedObjectContext的每个方法吗?
答案 0 :(得分:2)
核心数据(与多线程相结合)确实可能是您遇到麻烦的原因 - 我遇到了类似的问题。
以下是关于此主题的精彩文章:Core Data and threads, without the headache
我还在堆栈跟踪中看到对performSelector:
的调用。您可能需要考虑使用Grand Central Dispatch,尽管在您的情况下可能需要重写很多。
至于你的实际问题(追踪死锁),我建议也使用乐器。另外,请查看其他线程的状态。
答案 1 :(得分:0)
你说:
除非代码在运行上运行,否则调试器没那么有用 主线程,你没有可用的堆栈跟踪。
事实并非如此。您将获得所有线程的堆栈跟踪。
每次冻结在同一条线上的事实都表明该线路有问题。这就是你在做的事情:
self.friendObj.affiliations = friendObject1.affiliations;
所以,我会在该行上设置一个断点,当Xcode在断点处停止时,分析friendObj1
的内存。也许有一些时髦的事情发生了。
在friendObj的课程中是否有自定义的“setAffiliations:”方法?也许某种程度上在那条线上发生了无限循环。
我会分析所有关于设置friendObj的“affiliations”属性的调用,并尝试确定你的bug在哪里。
另一个想法是:friendObj是一个Core Data对象吗?如果是这样,它应该在ManagedObjectContext中初始化。