iOS iPad графический интерфейс тупик при запуске. Висел на заставке - PullRequest
1 голос
/ 18 августа 2010

Приложение для iPad иногда зависает при запуске.Похоже, что основной поток заходит в тупик с другим потоком, но не уверен, почему.Любые идеи о том, что вызывает это и как отладить это?

К вашему сведению, мое приложение запускается как контроллер splitview с представлением списка слева и представлением web-сайта справа.Если я запускаю в портретном режиме со скрытым представлением списка, проблема не возникает.Также, если я отключаю рендеринг своей ячейки, когда не в основном потоке, приложение не зависает, но ячейки отображаются в виде черных прямоугольников.

Спасибо!

Вот мой основной поток.Весь код в этом стеке - это Apple Framework ...

#0  0x971c0142 in semaphore_wait_signal_trap ()
#1  0x971c5c06 in pthread_mutex_lock ()
#2  0x02685903 in CGFontCacheLock ()
#3  0x02685869 in CGGlyphLockLockGlyphBitmaps ()
#4  0x0a90bb5b in ripc_RenderGlyphs ()
#5  0x0a9199f8 in ripc_DrawGlyphs ()
#6  0x0268464c in draw_glyphs ()
#7  0x02683e97 in CGContextShowGlyphsWithAdvances ()
#8  0x035aafba in WebCore::Font::drawGlyphs ()
#9  0x035aaaf5 in WebCore::Font::drawGlyphBuffer ()
#10 0x035aa81a in WebCore::Font::drawSimpleText ()
#11 0x035aa4c0 in drawAtPoint ()
#12 0x035a9d5c in -[NSString(WebStringDrawing) _web_drawAtPoint:forWidth:withFont:ellipsis:letterSpacing:includeEmoji:] ()
#13 0x0043f632 in -[NSString(UIStringDrawing) drawAtPoint:forWidth:withFont:lineBreakMode:letterSpacing:includeEmoji:] ()
#14 0x0043f325 in -[NSString(UIStringDrawing) drawAtPoint:forWidth:withFont:lineBreakMode:] ()
#15 0x0055ba70 in -[UILabel _drawTextInRect:baselineCalculationOnly:] ()
#16 0x00559178 in -[UILabel drawTextInRect:] ()
#17 0x0045418f in -[UIView(CALayerDelegate) drawLayer:inContext:] ()
#18 0x02a708d2 in -[CALayer drawInContext:] ()
#19 0x02a704b0 in backing_callback ()
#20 0x02a6fd52 in CABackingStoreUpdate ()
#21 0x02a6f01d in -[CALayer _display] ()
#22 0x02a6eac7 in CALayerDisplayIfNeeded ()
#23 0x02a609e1 in CA::Context::commit_transaction ()
#24 0x02a60732 in CA::Transaction::commit ()
#25 0x00427556 in -[UIApplication _reportAppLaunchFinished] ()
#26 0x0042dd3e in -[UIApplication handleEvent:withNewEvent:] ()
#27 0x004294f7 in -[UIApplication sendEvent:] ()
#28 0x004311d8 in _UIApplicationHandleEvent ()
#29 0x033f817c in PurpleEventCallback ()
#30 0x02bec89c in CFRunLoopRunSpecific ()
#31 0x02beb8a8 in CFRunLoopRunInMode ()
#32 0x00427221 in -[UIApplication _run] ()
#33 0x0042f372 in UIApplicationMain ()

И еще один поток, отображающий ячейку в моем представлении списка.MyFancyPantsCell и ABTableViewCellView - мои классы.

#0  0x971c0142 in semaphore_wait_signal_trap ()
#1  0x971c5c06 in pthread_mutex_lock ()
#2  0x02685903 in CGFontCacheLock ()
#3  0x02685869 in CGGlyphLockLockGlyphBitmaps ()
#4  0x0a90bb5b in ripc_RenderGlyphs ()
#5  0x0a9199f8 in ripc_DrawGlyphs ()
#6  0x0268464c in draw_glyphs ()
#7  0x02683e97 in CGContextShowGlyphsWithAdvances ()
#8  0x035aafba in WebCore::Font::drawGlyphs ()
#9  0x035aaaf5 in WebCore::Font::drawGlyphBuffer ()
#10 0x035aa81a in WebCore::Font::drawSimpleText ()
#11 0x035aa4c0 in drawAtPoint ()
#12 0x035a9d5c in -[NSString(WebStringDrawing) _web_drawAtPoint:forWidth:withFont:ellipsis:letterSpacing:includeEmoji:] ()
#13 0x0043f632 in -[NSString(UIStringDrawing) drawAtPoint:forWidth:withFont:lineBreakMode:letterSpacing:includeEmoji:] ()
#14 0x0043f381 in -[NSString(UIStringDrawing) drawAtPoint:withFont:] ()
#15 0x000635ec in -[SymbolCellPainter drawContentView:selected:editing:frame:] 
#16 0x000452d0 in -[MyFancyPantsCell drawContentView:] 
#17 0x00044624 in -[ABTableViewCellView drawRect:] 
#18 0x0045418f in -[UIView(CALayerDelegate) drawLayer:inContext:] ()
#19 0x02a708d2 in -[CALayer drawInContext:] ()
#20 0x02a704b0 in backing_callback ()
#21 0x02a6fd52 in CABackingStoreUpdate ()
#22 0x02a6f01d in -[CALayer _display] ()
#23 0x02a6eac7 in CALayerDisplayIfNeeded ()
#24 0x02a609e1 in CA::Context::commit_transaction ()
#25 0x02a60732 in CA::Transaction::commit ()
#26 0x02a9e04f in CA::Transaction::release_thread ()
#27 0x971f61e3 in _pthread_tsd_cleanup ()
#28 0x971f5df6 in _pthread_exit ()
#29 0x00183bf2 in +[NSThread exit] ()
#30 0x00183b5b in __NSThread__main__ ()
#31 0x971ed81d in _pthread_start ()
#32 0x971ed6a2 in thread_start ()

Ответы [ 2 ]

3 голосов
/ 18 августа 2010

Похоже, вы создали другой поток, например, через [object performSelectorInBackground:@selector(foo) withObject:bar].И в этом потоке вы вызываете методы GUI.Вы должны вызывать методы GUI с помощью [object performSelectorOnMainThread:@selector(alpha) withObject:beta waitUntilDone:YES] (возможно, создать другой метод, который просто содержит методы GUI и вызывать его таким образом вместо выполнения 20 executeSelectorOnMainThreads).

Все методы GUI должны выполняться в основном потоке.

1 голос
/ 23 сентября 2010

Вы используете CATransitions где-нибудь в вашем коде?

Core Animation поддерживает два типа транзакций: неявные транзакции и явные транзакции. Неявные транзакции создаются автоматически, когда дерево слоев изменяется потоком без активной транзакции, и фиксируются автоматически при следующей итерации цикла выполнения потока. Явные транзакции происходят, когда приложение отправляет классу CATransaction начальное сообщение перед изменением дерева слоев, а затем сообщение фиксации.

Кажется, что неявные транзакции могут запускаться в фоновых потоках, вызывая drawRect оттуда. Если в главном потоке одновременно происходит рисование - у вас проблемы.

В этом случае [CATransaction begin] / [CATransaction commit] МОЖЕТ помочь.

...