简单的UITextView崩溃问题

5
我正在尝试在基本视图中使用简单的UITextView,但它会偶尔导致应用程序崩溃。有时候在我输入内容时崩溃,有时候在我滚动时崩溃,有时候在我按回车键后崩溃。从堆栈跟踪来看,似乎是由于渲染拼写检查、语法检查等UI元素的图形或动画相关代码引起的。
为什么这会导致我的应用程序崩溃?我需要导入其他库,还是需要为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的输出口。仍然是同样的崩溃。

非常感谢任何帮助!!!


需要更多细节:(1)您如何将文本视图添加到“基本视图”中?您使用界面构建器还是以编程方式添加它?(2)如果是以编程方式,请发布创建/添加代码。 - Michael Kessler
我正在使用Interface Builder,UITextView已连接到在视图控制器中声明的outlet。就是这样。我没有提到的一件事是,视图控制器作为模态视图控制器呈现。我只是按照苹果文档中“模态视图控制器”的示例代码从nib初始化视图控制器,并将其模态呈现。模态视图包含UITextView,但由于未知原因而崩溃。 - pmc255
原来是有一张特定的图片导致了崩溃。当使用[UIImage imageWithData:...]加载这张特定的图片后,对UITextView进行拼写下划线的后续交互会导致崩溃。这只发生在一张图片上,而这张图片似乎并没有任何格式问题。我已经向苹果报告了这个bug。 - pmc255
3个回答

2

EXC_BAD_ACCESS基本上意味着您正在访问应用程序未使用的内存。我猜您正在编辑变量或访问已释放的变量。请注释掉您的释放操作并查看结果。

编辑:也可能是您没有保留需要保留的变量。


我只在视图控制器被dealloc时调用release(当其视图被卸载时也会隐式调用),但是当应用程序崩溃时,这种情况不会发生。如果您查看堆栈跟踪,显然是由于与图形/动画相关的代码引起的。 - pmc255
你可能也没有正确保留它。没有代码很难说。我不会看堆栈跟踪,因为例如,如果它已被自动释放,它可能会在随机点崩溃或需要访问UITextField内部的一个不再保留的对象时崩溃。例如,您可能没有正确保留模态视图,当您单击文本字段并且更新操作去更新视图时,如果它没有被保留,它会像你的一样崩溃。很难说,但我会非常惊讶,它不是由太早释放或未保留对象引起的。 - Rudiger
UITextField或模态视图控制器的UIView对象需要手动保留吗?UIView对象始终被保留,因为它由UIViewController(或其子类)实例引用。我创建了一些示例应用程序,并没有将UITextField连接到输出口,但它仍然可以正常工作。我一直在以内存管理为重点进行调试(因为有些人提到了它),但我仍然无法找出问题所在。请参见我的原始帖子以获取更新的代码。 - pmc255
不应该,但你的程序出现了一些奇怪的问题。保留所有对象,然后往回推导。 - Rudiger
事实证明,这是由于特定图像引起的。在使用[UIImage imageWithData:]加载该特定图像后,当打开自动更正功能时,UITextView将崩溃。我能够通过从头创建一个新应用程序来重现这个问题。我已经向苹果报告了这个错误,因为即使是格式不正确的图像也不应该导致其他UI元素崩溃。 - pmc255
如果能够在某个地方上传这个特定的基础应用程序,那将会很有趣,因为这是一个令人惊讶的错误。但如果最终确认是一个错误,请确保将其放置为答案并标记为正确。 - Rudiger

1

我也遇到了同样的 bug。我在表格视图中使用文本视图,当自动更正关闭时就不会出现这种情况。


只有在使用UIImage加载图像时才会发生这种情况吗?我只能在使用UIImage加载特定图像时重现此错误。只有这个特定的图像会导致文本视图崩溃。 - pmc255
不确定您的意思。我在页面上有一些其他的图片,您是说它们会干扰文本视图吗? - unjust

0
我遇到了这个问题 - 我愚蠢地将我的TextView设置为文本颜色!所以,我有这个:
self.myTextView = [UIColor lightGrayColor];

用这个代替:

self.myTextView.textColor = [UIColor lightGrayColor];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接