2

iOS用のQuartzPDFAPIを使用するとクラッシュの問題が発生します。現在、SDK 4.0 GM Seedをコンパイルして、3.2 iPadで実行しています(3.2 SDKを使用してみましたが、同じ結果になりました)。

私が使用しているすべてのコードは、標準のApple Quartzドキュメントに基づいており、インターネット上のさまざまなソースからのものです。ですから、私が劇的に異なることや間違ったことをしていることを想像することはできません。

コードはシミュレーター(すべてのバージョン、ユニバーサルアプリ)で完全に実行され、「メモリ警告のシミュレーション」機能を使用している場合でも実行されます。リークツールを使用しましたが、リークは見つかりませんでした。BuildandAnalyzeも何も見つかりません。ライブラリにクラッシュやメモリ不足のログが残っていません。

これはすべて、デバイスのメモリが不足していると私に信じさせます。これは、たとえば50 pdfページを実行した後に発生し、約35%が何らかの画像(フルページ、アイコン)を持っています。特定のページでクラッシュすることはありません。私がロードしているPDFは約75ページと3.5MBです。

私はこのサイトとインターネットの周りで同様の問題を熟読し、以下のコードのアドバイスのいくつかを適用しました。私は今、ページめくりごとにpdfドキュメント参照をリリースし、ページ参照を保持/リリースしなくなりました。また、画像の交換をCGImagesの使用からUIGraphicsGetImageFromCurrentImageContext関数の使用に簡略化しました。pdfImgViewを(を使用して)新しく割り当てられた一時インスタンスに完全に置き換える、pdfImgView[[UIImageView alloc] iniWithImage:UIGraphicsGetImageFromCurrentImageContext()]のセッターを使用する、一時を解放するなど、画像を切り替えるためのさまざまな実装を試しました。すべてのバリエーションはリークテストとアナライザーテストに合格しますが、それでも同じクラッシュ動作を示します。

それで、私がPDFから完全に離れる前に、私が試みるべき何かまたは私が欠けている何かがありますか?

ページを交換するため、および最初のロード時にインターフェイスハンドラーで呼び出されるコントローラーコードを表示します。

[self drawPage];

// ...animation code...simple CATransition animation...crashes with or without

// scrollView is a UIScrollView that is a subview of self.view
[scrollView.layer addAnimation:transition forKey:nil];
// pdfImgView is a UIImageView that is a subview of scrollView
pdfImgView.image = UIGraphicsGetImageFromCurrentImageContext();

PDFページを構成してコンテキストに描画するために使用されるdrawPageメソッド:

[CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("BME_interior.pdf"), NULL, NULL);
pdfRef = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); // instance variable, not a property
CFRelease(pdfURL);
CGPDFPageRef page = CGPDFDocumentGetPage(pdfRef, currentPage);

CGRect box = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
// ...setting scale and imageHeight, both floats...

if (UIGraphicsBeginImageContextWithOptions != NULL) {
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.view.frame.size.width, imageHeight), NO, 0.0);
} else {
    UIGraphicsBeginImageContext(CGSizeMake(self.view.frame.size.width, imageHeight));
}
CGContextRef context = UIGraphicsGetCurrentContext();
NSLog(@"page is %d, context is %d, pdf doc is %d, pdf page is %d", currentPage, context, pdfRef, page); // all prints properly

// ...setting up scrollView for new page, using same instance...

CGContextTranslateCTM(context, (self.view.frame.size.width-(box.size.width*scale))/2.0f, imageHeight);
CGContextScaleCTM(context, scale, -1.0*scale);

CGContextSaveGState(context);
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);

CGPDFDocumentRelease(pdfRef);
pdfRef = NULL;
4

2 に答える 2

1

あはは!UIGraphicsEndImageContext();新しい画像コンテキストを開始する前にを追加することで、クラッシュを修正しました。今はメモリの警告も表示されません...

于 2010-06-22T18:48:47.327 に答える
0

呼び出し

CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);

CGContextDrawPDFPage私の同様の問題を解決する前に。

クレジットはヨハンのこの答えに行きます: 大量のメモリを消費するCGContextDrawPDFPage

于 2011-08-11T08:31:32.500 に答える