1

iPad アプリが起動時にハングすることがあります。メイン スレッドが別のスレッドとデッドロックしているように見えますが、その理由は不明です。これを引き起こしている原因とこれをデバッグする方法についてのアイデアはありますか?

参考までに、私のアプリは左側にリストビュー、右側にウェブビューを持つスプリットビューコントローラーとして始まります。リスト ビューを非表示にしてポートレート モードで開始すると、問題は発生しません。また、メイン スレッド上にないときにセルのレンダリングを無効にすると、アプリはハングしませんが、セルは黒い四角形として表示されます。

ありがとう!

これが私のメインスレッドです。このスタックのコードはすべて Apple フレームワークです...

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

2 に答える 2

3

を介して、別のスレッドを作成したようです[object performSelectorInBackground:@selector(foo) withObject:bar]。そして、そのスレッドで GUI メソッドを呼び出します。GUI メソッドを呼び出す必要があります[object performSelectorOnMainThread:@selector(alpha) withObject:beta waitUntilDone:YES](20 の performSelectorOnMainThreads を実行する代わりに、GUI メソッドだけを含む別のメソッドを作成し、この方法で呼び出すこともできます)。

すべての GUI メソッドはメイン スレッドで実行する必要があります。

于 2010-08-18T07:09:28.310 に答える
1

コードのどこかで CATransitions を使用していますか?

Core Animation は、暗黙的トランザクションと明示的トランザクションの 2 種類のトランザクションをサポートしています。暗黙的なトランザクションは、レイヤー ツリーがアクティブなトランザクションのないスレッドによって変更されると自動的に作成され、スレッドの実行ループが次に繰り返されるときに自動的にコミットされます。明示的なトランザクションは、アプリケーションがレイヤー ツリーを変更する前に CATransaction クラスに開始メッセージを送信し、その後にコミット メッセージを送信するときに発生します。

そこから drawRect を呼び出すバックグラウンド スレッドで、暗黙的なトランザクションが発生する可能性があるようです。同時にメイン スレッドで描画が行われていると、問題が発生します。

この場合、[CATransaction begin] / [CATransaction commit] が役立つ場合があります。

于 2010-09-22T21:12:42.420 に答える