2011-03-18 11 views
6

ここにいくつかの奇妙な振る舞いがあります。誰かが確認できることを願って、既知のバグであるか、回避策を提案してください。iPad上に大きなPDFを表示するとUIWebViewが漏れる

私のiPadアプリでは、大きなPDF(〜7MBとグラフィックス重いもの)を表示する必要があります。もちろん、抵抗が最も少ないパスはUIWebViewですが、表示後にアプリがクラッシュします。私は新しいプロジェクトでその振る舞いを分離し、その上でInstrumentsを動かしました。

結果は次のとおりです。彼らはUIWebViewで悪いリークが起こっていることを示しているようです。

最小のビューコントローラに必須コード:

-(IBAction)doPresent:(UIView *)sender 
{ 
    NSURL *url = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%d", [sender tag]] 
             withExtension:@"pdf"]; 
    UIWebView *wv = [[[UIWebView alloc] init] autorelease]; 
    UIViewController *vc = [[[UIViewController alloc] init] autorelease]; 
    [vc setView:wv]; 
    UINavigationController *holder = [[[UINavigationController alloc] initWithRootViewController:vc] autorelease]; 

    [self presentModalViewController:holder animated:YES]; 
    [wv loadRequest:[NSURLRequest requestWithURL:url]]; 

    UIBarButtonItem *close = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
                      target:self 
                      action:@selector(doDismiss:)] autorelease]; 
    [[vc navigationItem] setRightBarButtonItem:close]; 
} 

-(IBAction)doDismiss:(id)sender 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

は描かれていない:このVC、そのビュー、および5つのボタンを含む主ニブはdoPresent:に接続され、それぞれが1 ... 5でタグ付け。アプリバンドルの1.pdf〜5.pdf。それを実行すると、期待どおりに動作しますが、PDFが半ダース程度表示された後にクラッシュするという点が異なります。私は気づくパターンが、私はPDFを表示し、文書の周りにスクロールせずにそれを閉じた場合に予想されるように、それがリリースさ、ということである plot of memory usage

:楽器(割り当て)の下でそれを実行

はこの興味深いプロットをもたらしました漏れを最小限に抑えるしかし、私が触ってスクロールすると、ちょっとでもメモリは解放されません。後続のPDFを表示しても、無駄になったメモリは再利用されていないように見えますが、それぞれのメモリを割り当てています。シミュレータを実行してメモリ警告をトリガしても、このメモリは復帰しません。

使用量が〜25MBに達すると、プログラムはkill -9 'になりました。これは私にとっては低そうだ、他のいくつかのリソースがアプリのメモリのほかに漏れていることを示唆している。

これはiPad 1上で実行され、4.3が実行され、再起動されました。

アイデア?回避策?私の愚かな欠点は?

+1

に固定しているようです。同じビューをリサイクルすると、それは違うのですか?私たちが持っていた漠然とした問題の解決策は、Webビューを閉じる前に 'about:blank'のような空のページをロードすることでした。 – drawnonward

+0

私はabout:blank trickを試していません。それは一見価値があるかもしれません。 – rgeorge

+0

ウェブビューをいくらかリサイクルすると問題は緩和されますが、問題は解決されません。 – rgeorge

答えて

2

さて、Appleは最終的に私にバグレポートを送ってくれました。彼らはこのバグを認識し、最新のios 5.xビルドで修正されたと主張しています。我々は見るでしょう。

+0

私は同じ問題を抱えていて、Leavesクラスを含むPDFを複数の方法で試してみました。結果は常に同じで、最終的にアプリケーションは8-9 PDFを読み込んだ後にクラッシュします。私はあなたのポストを見た後IOS 5でそれを試して待つことができません。 –

+0

@rgeorgeは今修正されていますか? – KarenAnne

+0

問題とAppleの答えにリンクしますか? – SteakOverflow

1

私はユーザー: "drawnonward"が何かにいると思います。あなたのコードを見ると、各ボタンを押すだけで、新しいWebViewをallocして初期化するのではなく、新しいUIViewControllerと新しいUINavigationControllerを押すことができます。ボタンを押すたびにこれらの各オブジェクトの新しいインスタンスを作成する必要がある場合を除いて、各オブジェクトのインスタンスが1つだけになるように再コーディングし、各ボタンを押して新しいコンテンツをWebビューにロードします。

私は、これがあなたの問題を解決する可能性が非常に高いと思います。

+0

...しかし、私はそれらを漏らしていません。それは事です。 UINavigationControllersをスローウェイとして使用することは、他のところで大きな影響を及ぼしてきた、リンゴを裏付けしたOKのパターンです。自分で後で解決する限り、安全です。 – rgeorge

+0

私はあなたがそれらを漏らしていたと言っています。私がしたい点は、NavController、ViewController、およびWebViewをリサイクルすることで、(理論上は)あなたの問題を解決する割り当てを最小限に抑えることができるという点です。オブジェクトを自動解放するように設定すると、オブジェクトで完了した2番目のオブジェクトは解放されず、オブジェクトがプールに追加されます。オブジェクトはプールが空になるまでメモリにとどまります。いずれにしても、アップル社はiOS 5のためにこれを修正しました。 – EmphaticArmPump

1

私の場合、私は常にwebviewのPDFから戻ってきます。あなたはこのようなものを使用してトップにscoll場合:

for (UIView *subview in webView.subviews) 
{ 
    if ([subview isKindOfClass:[UIScrollView class]]) 
     [subview setContentOffset:CGPointZero animated:NO]; 
} 

問題あなたは新しいのUIWebViewたびに作成しているように見えます

+0

私は閉じたUIViewControllerを閉じたときに、iPad上でクラッシュするUIWebViewと同様の問題を抱えていました。コンテンツは「慣性」効果のために、まだアクティブにスクロールしていました。これは私のためにそれを固定した。 – avance

関連する問題