为什么这会导致我的应用程序崩溃?我需要导入其他库,还是需要为UITextView指定某种委托?我只是在一个基本的视图中放了一个简单的UITextView,没有什么花哨的东西。
以下是堆栈跟踪:
Program received signal: “EXC_BAD_ACCESS”.
(gdb) bt
#0 0x9535f9b1 in ?? ()
#1 0x9534c33f in ?? ()
#2 0x9534c13e in ?? ()
#3 0x9634df5c in ?? ()
#4 0x9418d244 in CGDataProviderRetain ()
#5 0x963b7036 in ?? ()
#6 0x98263486 in CGImageReadCreateWithProvider ()
#7 0x982633a2 in CGImageSourceCreateWithDataProvider ()
#8 0x020c0947 in CGImageCreateWithPNGDataProvider ()
#9 0x02ebfeed in WKGraphicsCreateImageFromBundleWithName ()
#10 0x02ebfc3b in WebCore::GraphicsContext::drawLineForMisspellingOrBadGrammar ()
#11 0x02ebf9cb in WebCore::InlineTextBox::paintSpellingOrGrammarMarker ()
#12 0x02e73932 in WebCore::InlineTextBox::paintDocumentMarkers ()
#13 0x02e730a1 in WebCore::InlineTextBox::paint ()
#14 0x02e717ef in WebCore::InlineFlowBox::paint ()
#15 0x02e71565 in WebCore::RootInlineBox::paint ()
#16 0x02e71220 in WebCore::RenderLineBoxList::paint ()
#17 0x0354c451 in WebCore::RenderBlock::paintContents ()
#18 0x02e6d7bd in WebCore::RenderBlock::paintObject ()
#19 0x02e6ed51 in WebCore::RenderBlock::paint ()
#20 0x02e6dcf2 in WebCore::RenderBlock::paintChildren ()
#21 0x02e6d7bd in WebCore::RenderBlock::paintObject ()
#22 0x02e6ed51 in WebCore::RenderBlock::paint ()
#23 0x02e6c502 in WebCore::RenderLayer::paintLayer ()
#24 0x02e6bce3 in WebCore::RenderLayer::paintLayer ()
#25 0x02e6b635 in WebCore::RenderLayer::paint ()
#26 0x02e6b3de in WebCore::FrameView::paintContents ()
#27 0x03bd71da in -[WebFrame(WebInternal) _drawRect:contentsOnly:] ()
#28 0x03bd7104 in -[WebHTMLView drawSingleRect:] ()
#29 0x02e6af68 in _WKViewDraw ()
#30 0x02e6b03f in _WKViewDraw ()
#31 0x02e6b03f in _WKViewDraw ()
#32 0x02e6b03f in _WKViewDraw ()
#33 0x02e6b03f in _WKViewDraw ()
#34 0x02e6adb0 in WKViewDisplayRect ()
#35 0x02e6ad41 in WKWindowDrawRect ()
#36 0x02e6a9d3 in WebCore::TileCache::drawLayer ()
#37 0x04041d63 in backing_callback ()
#38 0x0404161e in CABackingStoreUpdate ()
#39 0x040407f4 in -[CALayer _display] ()
#40 0x02e6a3d4 in -[TileLayer display] ()
#41 0x040402b1 in CALayerDisplayIfNeeded ()
#42 0x0403f65b in CA::Context::commit_transaction ()
#43 0x0403f2b0 in CA::Transaction::commit ()
#44 0x04046f5b in CA::Transaction::observer_callback ()
#45 0x02391d1b in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#46 0x02326987 in __CFRunLoopDoObservers ()
#47 0x022efc17 in __CFRunLoopRun ()
#48 0x022ef280 in CFRunLoopRunSpecific ()
#49 0x022ef1a1 in CFRunLoopRunInMode ()
#50 0x02c152c8 in GSEventRunModal ()
#51 0x02c1538d in GSEventRun ()
#52 0x002e2b58 in UIApplicationMain ()
编辑:看起来这确实是由于自动更正功能引起的,因为堆栈跟踪暗示了这一点。如果我在Interface Builder中的“文本输入特性”下设置“更正”属性(我相信它是UITextInputTraits协议的autocorrectionType属性)为“否”,那么问题就会消失。开启自动更正后,我可以通过输入拼写错误的单词来重现该bug。
另一个需要注意的事情是,这是使用我昨天刚下载的最新iOS 4.1 SDK,所以我不知道这是否是最新SDK中UITextView的bug。
编辑2:哇,我真的对此感到困惑。我从头开始创建了一些新项目,并尝试使用UITextView显示模态视图控制器,它们都没有任何问题。然而,当我尝试在我的实际应用程序中执行相同操作时 - 无论我尝试从哪个控制器调用模态视图控制器 - 它总是崩溃。我已经将代码简化到最简形式,它仍然会崩溃。以下是我如何初始化模态视图控制器的方式:
- (IBAction)showFeedback:(id)sender {
FooViewController *controller = [[FooViewController alloc] initWithNibName:@"FooView" bundle:nil];
[self presentModalViewController:controller animated:YES];
[controller release];
}
FooViewController是由Xcode生成的骨架视图控制器,继承自UIViewController。没有覆盖任何内容。我的nib文件只包含一个带有单个普通UITextView的空视图。其他所有内容都是默认值。
崩溃总是发生在我输入拼写错误的单词后立即发生,模拟器试图显示红色下划线。
我尝试过使用NSZombieEnabled运行,日志中没有关于消息发送到僵尸的记录。
我的应用程序非常简单 - 一个基于选项卡的应用程序,每个选项卡都有导航控制器。然后,我的5个自定义视图控制器被设置为每个导航控制器的根控制器。目前,我的一个自定义视图控制器创建并呈现模态控制器。我尝试注释掉父视图控制器中的任何释放调用,但没有用。
我不明白的是,图形例程正在尝试访问哪些可能已被释放(或未保留)的对象,这些对象在内存管理方面属于我的应用程序的责任?在我看来,唯一可能的是UITextView,我已经尝试将其声明为具有保留属性,并将其设置为Interface Builder的输出口。仍然是同样的崩溃。
非常感谢任何帮助!!!