【问题标题】:Calling [self setNeedsDisplay] in UIView crashes every time在 UIView 中调用 [self setNeedsDisplay] 每次都会崩溃
【发布时间】:2010-11-24 20:51:22
【问题描述】:

当我使用 iOS 4.2 最终版 SDK 在 iPad 上使用新的 4.2.1 固件进行测试时,这才开始发生,但是自从上次在我的设备上测试以来,我已经更改了很多代码,所以我不能100% 确定它与 4.2.1 相关,尽管它看起来很有可能。我之前使用 4.2 beta3 SDK 在 4.2 beta3 上进行测试,没有任何问题。

我有一个可以进行一些 Quartz 2D 绘图的视图。每次我在其上调用 [self setNeedsDisplay] 以更新绘图时,应用程序都会因信号 0 而崩溃。我以前从未遇到过此问题,并且一直使用该调用来重绘视图而没有问题。

以前有没有人遇到过这种情况,或者有任何关于原因可能是什么的信息?崩溃发生在调用 drawRect: 之前,所以我不确定如何调试它。

它不会在模拟器中崩溃,只会在实际设备上崩溃。

设备上没有生成崩溃日志,调试器中显示的确切错误如下:

Program received signal:  “0”.
Data Formatters temporarily unavailable, will re-try after a 'continue'. (Unknown error loading shared library "/Developer/usr/lib/libXcodeDebuggerSupport.dylib")

此外,在有人建议使用过多内存作为信号 0 错误经常出现的问题之前,应用程序在崩溃发生时仅使用 1.4mb 的 ram(在 Instruments 中查看)并且我没有看到很大在崩溃之前分配的峰值或任何东西。它在使用超过 1.4mb 时崩溃。


更新:我一直在努力解决这个问题,这是我目前发现的。

  1. 4.2 最终版 SDK 和 iOS 4.2.1 似乎存在一些问题,但它们似乎与此特定问题无关。
  2. 我已降级到以前为我工作的 4.2 beta 3,但它仍然以同样的方式崩溃
  3. 如果我没有在我的类中重写 drawRect: 方法并且我调用 setNeedsDisplay 不会崩溃。
  4. 如果我覆盖 drawRect:,即使我保持它为空(只是调用 [super drawRect:] 或什至让它完全为空)它确实会崩溃。

因此,出于某种原因,完全实现drawRect: 会导致此问题。这没有任何意义,因为自从我开始这个项目以来,我已经以同样的方式实现了这段代码,现在才遇到这个问题。


更新:毕竟这与我正在绘制的视图的大小有关。尽管 Instruments 工具似乎没有在某些情况下显示它原因,根据这篇文章:iPhone + UIView. Enormous memory consumption during drawRect. Any strategies for reducing this? 使用 setNeedsDisplay 时:在大视图上存在巨大的内存峰值,唯一真正解决它的方法是使用较小的平铺视图并分别绘制。

我从滚动视图中删除了一堆图像,并且能够在没有崩溃的情况下看到内存警告。我发现如果我在滚动视图中减小绘图视图的大小,就不会再出现内存错误。我之前的绘图视图几乎是 4000x4000。将其降低到 3000x2000 并且不再崩溃。

现在我的问题是我需要一个连续的绘图视图,由于我正在绘制的内容的性质,我不确定是否可以平铺它。但这是另一个帖子的问题。

【问题讨论】:

  • 发布崩溃发生的情况。您确实会收到崩溃报告,这些报告会帮助我们帮助您。
  • 你在哪里调用 setNeedsDisplay?
  • 你有没有可能在后台线程上调用setNeedsDisplay
  • 在 UIView 子类的方法中调用 setNeedsDisplay。该方法由 NSNotification 调用。为了排除我尝试使用 performSelectorOnMainThread 的任何线程问题,它具有相同的结果。 // 它似乎没有在设备上生成任何崩溃多头,只是显示信号 0 并崩溃。我将在我的问题末尾粘贴确切的错误。
  • 尝试删除设备上的应用程序,然后通过 Xcode 重新安装。我有一个奇怪但类似的问题,在更新到 4.2 最终 SDK 和 iOS 4.2.1 后,Core Data 模型无法编译和正确安装,这似乎已经解决了。

标签: iphone objective-c


【解决方案1】:

试试这个Other Answer/Solution 基本上可能是内存问题。

【讨论】:

  • 我已经读过那篇文章了。就像我在问题中所说的那样,我意识到这些通常是内存问题,但在这种情况下并非如此。该应用程序在崩溃时使用了所有 1.4mb 的内存。此外,它在 4.2 beta 3 上运行良好,只是现在在 4.2.1 final 上它崩溃了。我的另一个应用程序现在也有一些奇怪的符号问题,因为我已经更新到 4.2.1(当它崩溃时它不会显示我调试,而是抱怨丢失的文件),所以我要去从头开始重新安装 Xcode,看看是否有什么不同。当我更新 Xcode 时,似乎有些事情可能会变得一团糟。
  • 实际上看起来你是对的。尽管 Instruments 工具似乎由于某种原因没有显示它,但根据这篇文章:*.com/questions/1864218 when using setNeedsDisplay: 在大视图上存在内存峰值。我从滚动视图中删除了一堆图像,并且能够在没有崩溃的情况下看到内存警告。我发现如果我在滚动视图中减小绘图视图的大小,就不会再出现内存错误。我之前的视野几乎是 4000x4000。将其降低到 3000x2000,不再出现崩溃。
  • 不错。很高兴你能修复它。我知道文档建议不要大于 1024x1024(注意在 UIView 类参考的顶部)。我想你已经知道原因了。