6

2 年前我写了一个巨大的 iPad 应用程序,现在我回到它并将它升级到 iOS5。它有点乱,因为它是我的第一个大型 iPad 应用程序。

它有一个可能持续几分钟的“同步”步骤,这些是一堆异步方法调用,它们从 url 获取 JSON 并将它们放入核心数据中。应用程序经常会冻结(UI 无响应)。

有什么好的技术可以追踪这种冻结?调试器没有那么有用,除非代码在主线程上运行,否则您没有可用的堆栈跟踪。该应用程序通常也无法恢复,这表明存在某种死锁情况。

这是一个可能有帮助的特定示例:

在此处输入图像描述

一旦我确认它被冻结,我就暂停了执行。它似乎每次都冻结在同一行 - 一个简单的任务。这里发生了什么?它太令人沮丧了。

这是导致这种情况的核心数据访问吗?任何指针将不胜感激。

编辑 2012 年 6 月 29 日

单击此处查看执行所有核心数据对象的创建/更新/删除的类的源代码。我只需要停止此应用程序中的冻结/崩溃。我知道它一团糟,它也让我畏缩。两年前我写了这篇文章,几乎没有任何objective-c知识。我应该重新编写它,但我必须在 2 天内完成这项工作并且从我的脑海中消失。谁能给我一些关于快速获得这个线程安全的方法的指示?我可以将每个更新 NSManagedObjectContext 的方法包装在大型中央调度块代码中吗?

4

2 回答 2

2

Core Data(结合多线程)确实有可能是您遇到麻烦的原因 - 我遇到了类似的问题。

这是一篇关于这个主题的优秀文章:Core Data and threads, without the heading

performSelector:我还在您的堆栈跟踪中看到了一个调用。您可能需要考虑使用 Grand Central Dispatch,尽管在您的情况下可能需要重写很多内容。

至于您的实际问题(追踪死锁),我建议您也使用 Instruments。另外,查看其他线程的状态。

于 2012-06-28T12:32:06.937 回答
0

你说:

调试器没有那么有用,除非代码在主线程上运行,否则您没有可用的堆栈跟踪。

这不是真的。您可以获得所有线程的堆栈跟踪。

它每次都冻结在同一条线上的事实表明该线有问题。这就是你正在做的事情:

self.friendObj.affiliations = friendObject1.affiliations;

所以,我会在该行上放一个断点,当 Xcode 在断点处停止时,分析friendObj1. 也许有一些时髦的事情正在发生。

您的friendObj 的课程中​​是否有自定义的“setAffiliations:”方法?也许不知何故在那条线上发生了无限循环。

我将分析围绕设置您的friendObj 的“附属关系”属性的所有调用,并尝试确定您的错误在哪里。

另一个想法:friendObj 是核心数据对象吗?如果是这样,则应在 ManagedObjectContext 中对其进行初始化。

于 2012-06-29T00:13:58.027 回答