2010-09-09 8 views
5

J'essaie d'utiliser un UITextView simple dans une vue de base, mais il provoque l'application de plantage sporadique. Parfois, il se bloque pendant que je tape quelque chose, parfois lorsque je défile, parfois après avoir appuyé sur la touche de retour. De la trace de la pile, il semble que ce soit causé par des graphiques ou du code lié à l'animation pour rendre les éléments de l'interface utilisateur pour vérifier l'orthographe, vérifier la grammaire, etc.Simple UITextView plantant

Pourquoi cette application plante-t-elle? Ai-je besoin d'importer des bibliothèques supplémentaires ou dois-je spécifier un type de délégué pour UITextView? J'ai littéralement un simple UITextView dans une vue barebones, rien d'extraordinaire.

est ici la trace de la pile:

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

EDIT: il semble que cela est en effet causé par la fonctionnalité de correction automatique, la trace de la pile fait allusion à. Si je définis la propriété "Correction" sous "Caractères d'entrée de texte" dans Interface Builder (je crois que c'est la propriété autocorrectionType du protocole UITextInputTraits) à "Non", le problème disparaît. Avec l'autocorrection, je peux toujours reproduire le bug en tapant des mots qui sont mal orthographiés. Une autre chose à noter est que c'est avec le dernier SDK iOS 4.1 que je viens de télécharger hier, donc je ne sais pas si c'est un bug UITextView dans le dernier SDK ou quoi.

EDIT 2: Wow, je suis vraiment perplexe. J'ai créé quelques nouveaux projets à partir de zéro et essayé d'afficher les contrôleurs de vue modale avec UITextViews, et ils ont tous travaillé sans problème. Cependant, quand j'essaie de faire la même chose dans mon application actuelle - quel que soit le contrôleur que j'essaie d'invoquer un contrôleur de vue modale de - il se bloque toujours. J'ai fait bouillir le code jusqu'aux barebones, et il se bloque toujours. Voici comment j'initialiser un contrôleur de vue modal:

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

FooViewController est juste un contrôleur de vue squelette généré par Xcode qui hérite de UIViewController. Rien n'est ignoré. Mon fichier nib contient juste une vue vide avec un seul UITextView vanille. Tout le reste est la valeur par défaut.

L'incident se produit toujours immédiatement après avoir tapé un mot mal orthographié et le simulateur essaie d'afficher des soulignements rouges.

J'ai également essayé de courir avec NSZombieEnabled, et je ne vois rien dans les journaux concernant les messages envoyés aux zombies.

Mon application est assez simple - une application basée sur des onglets avec des contrôleurs de navigation pour chacun de mes 5 onglets. Mes 5 contrôleurs de vue personnalisés sont ensuite définis en tant que contrôleurs racine de chacun des contrôleurs de navigation. J'ai actuellement un de mes contrôleurs de vue personnalisés créer et présenter le contrôleur modal. J'ai essayé de commenter tous les appels de libération dans le contrôleur de vue parent, en vain. Ce que je ne comprends pas, c'est quels objets les routines graphiques essayant d'accéder peuvent avoir été libérées (ou non conservées) qui relèvent de la responsabilité de mon application en ce qui concerne la gestion de la mémoire? Dans mon esprit, la seule chose possible est UITextView, et j'ai essayé de la déclarer comme une propriété avec retain, et de la définir comme un point de vente avec Interface Builder. Toujours, le même accident.

Toute aide est grandement appréciée !!!

+0

Besoin de précisions: (1) Comment vous ajoutez l'affichage du texte à la « vue de base »? Utilisez-vous le constructeur Interface ou l'ajoutez-vous par programmation? (2) Si par programme, ensuite poster le code de création/ajout. –

+0

J'utilise Interface Builder et l'UITextView est connecté à une prise déclarée dans le contrôleur de vue. C'est à peu près tout. Une chose que je n'ai pas mentionnée est que le contrôleur de vue est présenté comme un contrôleur de vue modale. Je viens de suivre l'exemple de code d'Apple dans les docs pour "Modal View Controllers" pour initialiser le contrôleur de vue d'une plume, et le présenter modalement. La vue modale contient l'UITextView, qui se bloque pour des raisons inconnues. – pmc255

+0

Il s'avère qu'il y a une image particulière qui provoque le crash. Lorsque cette image particulière est chargée avec [UIImage imageWithData: ...], les interactions suivantes avec l'UITextView qui entraînent des soulignements d'orthographe entraînent un plantage. Cela se produit uniquement avec une image, qui ne semble pas être mal formée ou quoi que ce soit. J'ai classé cela comme un bug avec Apple. – pmc255

Répondre

2

EXC_BAD_ACCESS signifie essentiellement que vous accédez à la mémoire qui n'est pas utilisée par votre application.Je suppose que vous modifiez une variable ou que vous accédez à une variable que vous avez déjà publiée. Commentez vos sorties et voyez comment ça se passe.

EDIT: Cela peut également signifier que vous ne retenez pas une variable qui doit l'être.

+0

J'appelle seulement la version quand le contrôleur de vue est libéré (et je suppose implicitement quand sa vue est déchargée), mais cela ne se produit pas quand l'application se bloque. Si vous regardez la trace de la pile, elle est clairement causée par le code lié aux graphiques/animations. – pmc255

+0

Vous pourriez également ne pas le conserver correctement. C'est difficile à dire sans code. Je ne regarderais pas la trace de la pile car, par exemple, si elle avait été auto-libérée, elle pourrait tomber en panne à un point aléatoire ou un point nécessitant son accès à un objet non retenu dans les entrailles de UITextField. Vous pouvez également ne pas conserver la vue modale par exemple correctement et lorsque vous cliquez sur le champ de texte et que les mises à jour vont mettre à jour la vue et qu'elle n'est pas conservée, elle se bloquerait comme la vôtre. Difficile à dire mais je serais très surpris qu'il ne soit pas causé soit par la libération trop tôt ou par la non-conservation d'un ob – Rudiger

+0

L'objet UITextField ou l'objet UIView du contrôleur de vue modale doit-il être conservé manuellement? L'objet UIView est toujours conservé, puisqu'il est référencé par l'instance UIViewController (ou ses classes enfants). J'ai créé quelques exemples d'applications et je n'ai pas connecté l'UITextField à un point de vente, et cela a toujours fonctionné correctement. J'ai commencé une recherche de débogage avec la gestion de la mémoire à l'esprit (puisque quelques personnes l'ont mentionné), mais je n'arrive toujours pas à comprendre le problème. Voir mon message original pour le code mis à jour. – pmc255

1

J'ai rencontré ce même bug. J'utilise des vues de texte dans une vue de table, et cela ne se produit pas lorsque l'autocorrection est désactivée.

+0

Cela se produit-il uniquement lorsque vous chargez une image avec UIImage? Je ne peux reproduire ce bug que lors du chargement d'une image * particulière * en utilisant UIImage. Seule cette image particulière entraîne le blocage de l'affichage du texte. – pmc255

+0

Vous ne savez pas ce que vous voulez dire. J'ai des images ailleurs sur la page, dites-vous que cela interfère avec le textview? – unjust

0

J'ai eu ce problème - j'avais bêtement mis mon TextView au lieu de la couleur du texte! Alors, j'ai eu ceci:

self.myTextView = [UIColor lightGrayColor]; 

au lieu de ceci:

self.myTextView.textColor = [UIColor lightGrayColor];