【发布时间】: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 时崩溃。
更新:我一直在努力解决这个问题,这是我目前发现的。
- 4.2 最终版 SDK 和 iOS 4.2.1 似乎存在一些问题,但它们似乎与此特定问题无关。
- 我已降级到以前为我工作的 4.2 beta 3,但它仍然以同样的方式崩溃
- 如果我没有在我的类中重写
drawRect:方法并且我调用 setNeedsDisplay 不会崩溃。 - 如果我覆盖
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