1

我的iPad應用程序有時會掛起。它看起來像主線程與另一個線程僵局,但不知道爲什麼。任何想法是什麼導致這個以及如何調試?啓動時iOS iPad GUI死鎖。在啓動屏幕上掛起

僅供參考我的應用程序最初是一個分割視圖控制器,左側是一個listview,右側是一個webview。如果我以隱藏列表視圖的縱向模式啓動,則不會發生問題。另外,如果我在不在主線程上時禁用了我的單元格渲染,應用程序不會掛起,但單元格顯示爲黑色矩形。

謝謝!

這是我的主線程。在這個堆棧上的所有代碼是蘋果框架...

#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() 
+0

這是一個可疑的死鎖,因爲它看起來像他們都在同一個對象上等待(除非有多個字體緩存,這不應該是)。但是UIGraphics */NSString繪圖/ UIImage繪圖在4.0之前記錄爲無線程安全。 – 2010-08-21 07:52:17

回答

3

我看起來像你已經創建了另一個線程,例如,通過[object performSelectorInBackground:@selector(foo) withObject:bar]。在那個線程中你可以調用GUI方法。您應該使用[object performSelectorOnMainThread:@selector(alpha) withObject:beta waitUntilDone:YES]調用GUI方法(也許創建另一種方法,只包含GUI方法,並以此方式調用該方法,而不是執行performSelectorOnMainThreads)。

所有GUI方法都應該在主線程上運行。

+0

謝謝......現在我真正想知道的是如何檢測何時從GUI線程中做出不安全的東西。調試提示。因爲「另一個」線程堆棧中沒有多少線索。它似乎是掛鉤到線程關閉的一些核心動畫代碼。但是你看不到代碼要求視圖在線程關閉時顯示自己。 – Cal 2010-08-19 04:06:33

+0

規則很簡單,我猜:只在主線程中調用UI *類型的對象的方法。但是對於調試:一個棘手的問題恐怕我不知道如何在這裏找到罪魁禍首。 – DarkDust 2010-08-27 06:49:30

1

你是否在你的代碼中使用了CATransitions?

核心動畫支持兩種類型的事務:隱式事務和顯式事務。隱式事務是在沒有活動事務的線程修改層樹時自動創建的,並且在線程的下一次迭代運行循環時自動提交。顯式事務發生在應用程序在修改層樹之前向CATransaction類發送開始消息並在之後發送提交消息時發生。

似乎隱式事務可以在後臺線程調用drawRect從那裏觸發。 如果在主線程中同時進行了一些繪圖 - 您遇到了麻煩。

在這種情況下,[CATransaction begin]/[CATransaction commit]可以提供幫助。