1

我的 iPad 应用程序有时会在启动时挂起。看起来主线程与另一个线程死锁,但不知道为什么。关于导致此问题的原因以及如何调试此问题的任何想法?

仅供参考,我的应用程序以拆分视图控制器开始,左侧是列表视图,右侧是 web 视图。如果我以隐藏列表视图的纵向模式开始,则不会发生问题。此外,如果我不在主线程上禁用我的单元格的渲染,则应用程序不会挂起,但单元格显示为黑色矩形。

谢谢!

这是我的主线。这个堆栈上的所有代码都是 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

我看起来你已经创建了另一个线程,例如 via [object performSelectorInBackground:@selector(foo) withObject:bar]。在那个线程中,您调用 GUI 方法。您应该调用 GUI 方法[object performSelectorOnMainThread:@selector(alpha) withObject:beta waitUntilDone:YES](也许创建另一个只包含 GUI 方法的方法并以这种方式调用该方法,而不是执行 20 个 performSelectorOnMainThreads)。

所有 GUI 方法都应该在主线程上运行。

于 2010-08-18T07:09:28.310 回答
1

您是否在代码中的某处使用 CATransitions ?

Core Animation 支持两种类型的事务:隐式事务和显式事务。当层树被没有活动事务的线程修改时自动创建隐式事务,并在线程的运行循环下一次迭代时自动提交。当应用程序在修改层树之前向 CATransaction 类发送开始消息,然后在之后发送提交消息时,就会发生显式事务。

似乎隐式事务可以在从那里调用 drawRect 的后台线程中触发。如果同时在主线程中进行一些绘图 - 你就有麻烦了。

在这种情况下,[CATransaction begin] / [CATransaction commit] 可能会有所帮助。

于 2010-09-22T21:12:42.420 回答