2010-09-09 11 views
5

Estoy tratando de usar un simple UITextView en una vista básica, pero hace que la aplicación se bloquee esporádicamente. A veces se cuelga mientras estoy escribiendo algo en él, a veces cuando estoy desplazándome, a veces después de presionar la tecla de retorno. Desde el seguimiento de la pila, parece que está siendo causado por un código relacionado con gráficos o animación para representar elementos de la interfaz de usuario para la revisión ortográfica, la comprobación de la gramática, etc.Simple UITextView estrellarse

¿Por qué se cuelga mi aplicación? ¿Debo importar bibliotecas adicionales, o debo especificar algún tipo de delegado para UITextView? Literalmente tengo una simple UITextView en una vista barebone, nada sofisticado.

Aquí está el seguimiento de la pila:

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() 

EDITAR: parece que este hecho está siendo causado por la funcionalidad de corrección automática, como el seguimiento de la pila alude a. Si configuro la propiedad "Corrección" en "Rasgos de entrada de texto" en el Creador de interfaz (creo que es la propiedad AutocorrectionType del protocolo UITextInputTraits) en "No", entonces el problema desaparece. Con la autocorrección activada, siempre puedo reproducir el error escribiendo palabras que están mal escritas.

Otra cosa a tener en cuenta es que esto es con el último iOS 4.1 SDK que acabo de descargar ayer, por lo que no sé si esto es un error UITextView en el último SDK o qué.

EDIT 2: Wow, estoy realmente perplejo por esto. Creé algunos proyectos nuevos desde cero y traté de mostrar controladores de vista modal con UITextViews, y todos funcionaron sin problemas. Sin embargo, cuando trato de hacer lo mismo en mi aplicación actual, no importa de qué controlador intente invocar un controlador de vista modal, siempre falla. He hervido el código en los huesos, y todavía se cuelga. Aquí es cómo inicializar un controlador de vista modal:

- (IBAction)showFeedback:(id)sender { 
    FooViewController *controller = [[FooViewController alloc] initWithNibName:@"FooView" bundle:nil]; 
    [self presentModalViewController:controller animated:YES]; 
    [controller release]; 
} 

FooViewController es sólo un controlador de vista esqueleto generada por Xcode que hereda de UIViewController. Nada es anulado. Mi archivo de punta simplemente contiene una vista vacía con un solo vainilla UITextView. Todo lo demás es el predeterminado.

El bloqueo siempre se produce inmediatamente después de escribir una palabra mal escrita, y el simulador intenta mostrar líneas rojas.

He intentado ejecutar con NSZombieEnabled también, y no veo nada en los registros de mensajes enviados a zombies.

Mi aplicación es bastante simple: una aplicación basada en pestañas con controladores de navegación para cada una de mis 5 pestañas. Mis 5 controladores de vista personalizados se configuran como los controladores raíz de cada uno de los controladores de navegación. Actualmente tengo uno de mis controladores de vista personalizados crear y presentar el controlador modal. Intenté comentar cualquier llamada de liberación en el controlador de vista principal, pero fue en vano.

Lo que no entiendo es, ¿a qué objetos son las rutinas gráficas que intentan acceder que pueden haber sido liberadas (o no) que caen bajo la responsabilidad de mi aplicación con respecto a la administración de memoria? Lo único posible, en mi opinión, es el UITextView, y he intentado declararlo como una propiedad con retener y configurarlo como una salida con Interface Builder. Aún así, el mismo choque.

¡Cualquier ayuda es muy apreciada!

+0

necesita más detalles: (1) ¿Cómo se agrega la vista de texto a la "visión básica"? ¿Utiliza el constructor de Interfaces o lo agrega programáticamente? (2) Si programáticamente, publique el código de creación/adición. –

+0

Estoy utilizando Interface Builder, y el UITextView está conectado a una toma de corriente declarada en el controlador de vista. Eso es practicamente todo. Una cosa que no mencioné es que el controlador de vista se presenta como un controlador de vista modal. Solo sigo el código de muestra de Apple en los documentos para "Controladores de vista modal" para inicializar el controlador de vista desde un plumín y presentarlo de manera modal. La vista modal contiene el UITextView, que simplemente se bloquea por razones desconocidas. – pmc255

+0

Resulta que hay una imagen en particular que está causando el bloqueo. Cuando esta imagen particular se carga con [UIImage imageWithData: ...], las interacciones posteriores con UITextView que dan como resultado subrayos ortográficos provocan un bloqueo. Esto solo sucede con una imagen, que no parece estar mal formada ni nada. He archivado esto como un error con Apple. – pmc255

Respuesta

2

EXC_BAD_ACCESS significa básicamente su memoria de acceso que no está siendo utilizada por su aplicación.Supongo que está editando una variable o accediendo a una variable que ya ha liberado. Comenta tus lanzamientos y ve cómo va eso.

EDITAR: También podría significar que no está conservando una variable que debe ser.

+0

Estoy llamando liberación cuando el controlador de vista está desasignado (y supongo que implícitamente cuando se descarga su vista), pero eso no ocurre cuando la aplicación falla. Si miras el rastro de la pila, claramente está siendo causado por un código relacionado con gráficos/animación. – pmc255

+0

También podría no conservarlo correctamente. Es difícil de decir sin código. No miraría la traza de pila porque, por ejemplo, si se liberara automáticamente podría bloquearse en un punto aleatorio o un punto que requiere acceso a un objeto que ya no se retiene en las entrañas del UITextField. También podría, por ejemplo, no conservar la vista modal correctamente y cuando hace clic en el campo de texto y las actualizaciones van a actualizar la vista y no se retiene, se bloqueará como la suya. Es difícil de decir, pero me sorprendería mucho que no se deba a que se haya soltado demasiado pronto o no se haya guardado ob – Rudiger

+0

¿Se deben retener manualmente los objetos UITextField o UIView del controlador de vista modal? El objeto UIView siempre se conserva, ya que la instancia de UIViewController (o sus clases secundarias) lo hace referencia. Creé algunas aplicaciones de muestra y no conecté el UITextField a una tienda, y aún funcionaba bien. He estado realizando una búsqueda de depuración teniendo en mente la administración de memoria (ya que algunas personas lo han mencionado), pero todavía no puedo resolver el problema. Ver mi publicación original para el código actualizado. – pmc255

1

He experimentado este mismo error. Estoy usando vistas de texto en una vista de tabla, y no sucede cuando la corrección automática está desactivada.

+0

¿Esto solo ocurre cuando carga una imagen con UIImage? Solo puedo reproducir este error cuando cargue una imagen * particular * usando UIImage. Solo esta imagen particular hace que la vista de texto se cuelgue. – pmc255

+0

No estoy seguro de lo que quiere decir. Tengo algunas imágenes en otra parte de la página, ¿estás diciendo que están interfiriendo con la vista de texto de alguna manera? – unjust

0

Tuve este problema: ¡había configurado estúpidamente mi TextView en lugar del color del texto! Por lo tanto, tenía esto:

self.myTextView = [UIColor lightGrayColor]; 

en lugar de esto:

self.myTextView.textColor = [UIColor lightGrayColor];