2

アプリケーションで次のコードを使用して、カスタム UIView を画像にレンダリングしています。このコードは、シミュレーター (iPad および iPad Retina) だけでなく、iPad 1 および iPad 2 デバイスでもうまく機能します。しかし、最近 iPad 3 デバイスでテストしたところ、クラッシュが発生し、解決できないようです。関連するコード スニペットは次のとおりです。

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 を使用しています。これは私を困惑させました。

これをさらにトラブルシューティングするためにどこを見ることができるかについての提案はありますか? 他の誰かがこの種の行動に遭遇しましたか?

前もって感謝します!

4

2 に答える 2

2

試す

UIGraphicsBeginImageContextWithOptions(CGSizeMake(myUIView.frame.size.width, myUIView.frame.size.height), NO, [[UIScreen mainScreen] scale]);
于 2012-06-28T22:55:13.960 に答える
1

最終的に、レンダリングしようとしていたビューの特定の UIImageView へのクラッシュの原因を突き止めることができました。このビューは、iPad 3 Retina 用の 2x グラフィックを使用していました。問題なく表示されましたが、renderInContext の呼び出し中に大量のメモリを消費していたようです。グラフィックのサイズを縮小し、コンテキスト オプションでレンダリング スケールも縮小しました。これでクラッシュは解決しました。

于 2012-07-03T04:20:23.417 に答える