2012-06-28 107 views
1

我一直在我的應用程序中使用下面的代碼來渲染出一個自定義UIView圖像。該代碼在模擬器(iPad和iPad視網膜)以及iPad 1和iPad 2設備上效果很好。不過,我最近在iPad 3設備上測試過它,並且正在發生一次我無法解決的崩潰。相關的代碼片段是:iPad 3設備崩潰renderInContext

UIGraphicsBeginImageContext(CGSizeMake(myUIView.frame.size.width, myUIView.frame.size.height)); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSaveGState(context); 
[myUIView.layer renderInContext:context]; 

應用程序在最後一行崩潰。以下是崩潰日誌:

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x12311000 
Crashed Thread: 5 

而且從後來的日誌中:

Thread 5 name: Dispatch queue: com.apple.root.default-overcommit-priority 
Thread 5 Crashed: 
0 ImageIO       0x3384bcb4 ImageIO_ABGR_TO_ARGB_8Bit + 68 
1 ImageIO       0x3388761c __copyImageBlockSetPNG_block_invoke_1 + 608 
2 libdispatch.dylib    0x348c0c52 _dispatch_call_block_and_release + 6 
3 libdispatch.dylib    0x348c3810 _dispatch_worker_thread2 + 252 
4 libsystem_c.dylib    0x33145df4 _pthread_wqthread + 288 
5 libsystem_c.dylib    0x33145cc8 start_wqthread + 0 

我首先認爲這是一個內存管理錯誤,但是這僅僅是iPad 3的設備和我正在使用ARC。這讓我難住。

任何我可能想要進一步解決問題的建議?有沒有其他人遇到過這種行爲?

在此先感謝!

+0

嗨,你有沒有找到解決方案,即時通訊也有同樣的問題?如果是這樣請分享解決方案 – Infaz

回答

2

嘗試

UIGraphicsBeginImageContextWithOptions(CGSizeMake(myUIView.frame.size.width, myUIView.frame.size.height), NO, [[UIScreen mainScreen] scale]); 
+0

我也在考慮這些方面,並嘗試過:UIGraphicsBeginImageContextWithOptions(CGSizeMake(myUIView.frame.size.width,myUIView.frame.size.height),YES,0.0);不幸的是,碰撞行爲是相同的 –

+0

我試着用你的建議的選項變體,這也觸發相同的崩潰 –

+0

傷心的小貓。我想知道在渲染操作過程中圖層是否可能發生變異。調用堆棧表明您是從後臺線程渲染的(即線程5)。嗯。嘗試在主線程上移動它,看看是否解決了這個問題?然後嘗試(連續)製作CALayer的副本,然後將其傳遞給後臺線程。 – lorean

1

終於能崩潰的來源追查到,我試圖渲染視圖特定的UIImageView。該視圖使用iPad 3視網膜的2x圖形。雖然它顯示得很好,但它顯然證明在renderInContext調用期間會消耗太多內存。我縮小了圖形的大小,並減少了上下文選項中的渲染比例。這解決了崩潰。

+1

即使縮小的圖像大小有幫助,在後臺線程支持UIKit類的層上調用-renderInContext:也是不安全的。更可能的是,視網膜圖像需要足夠長的時間才能呈現出您在主線程中與UIKit的爭用。 –

+0

我不是故意在一個單獨的線程上調用它。我正在渲染通過動畫塊動畫的自定義UIView。你能推薦一種方法把它放在主線程上嗎?由於動畫,它是否在後臺線程上?我可以排除故障的其他一些原因?提前致謝! –

+0

哦,所以renderInContext:在主線程上被調用? –