2011-03-18 3 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, 그 도면 및 다섯 개 개의 버튼을 포함하는 기본 펜촉 doPresent: 연결된 각각 1 ... (5) 태그; 앱 번들의 1.pdf ~ 5.pdf. 그것을 실행하면 예상대로 작동하지만, PDF가 반 정도 나간 후에 충돌합니다. 장치 (할당) 아래를 실행

이 흥미로운 플롯을 굴복 : 나는 알 패턴은 내가 PDF를 표시하고 문서 주위에 스크롤하지 않고 그것을 기각하는 경우 예상대로, 출시 것,이다 plot of memory usage

누설이 적다. 그러나 내가 그것을 만져서 스크롤해도 조금이라도 기억이 풀리지는 않습니다. 후속 PDF보기는 낭비되는 메모리를 재사용하는 것처럼 보이지 않지만 각각의 메모리를 더 많이 할당합니다. 시뮬레이터에서 실행하고 메모리 경고를 트리거해도이 메모리가 다시 확보되지 않습니다.

사용량이 25MB를 초과하면 프로그램에 kill -9 '이 (가) 있습니다. 이것은 내게는별로 보이지 않는데, 앱 메모리 외에도 다른 리소스가 유출되었다고 생각됩니다.

이것은 iPad 1에서 4.3을 실행하고 새로 재부팅되었습니다.

아이디어가 있으십니까? 해결 방법은 무엇입니까? 내 부분에 어리석은 누락?

+1

를 해결하는 것 같다. 동일한보기를 재활용하면 다른 것입니까? 우리가 막연하게 관련된 문제에 대한 해결책은 어떤 웹보기를 없애기 전에'about : blank'와 같은 빈 페이지를로드하는 것이 었습니다. – drawnonward

+0

나는 대략 시도하지 않았다 : 빈 마술. 그럴만 한 가치가 있을지도 모릅니다. – rgeorge

+0

웹보기를 약간 재활용하면 문제가 완화되지만 문제가 해결되지는 않습니다. – rgeorge

답변

2

글쎄, 애플은 마침내 버그 보고서를 받았다. 버그를 인식하고 최신 iOS 5.x 빌드에서 수정되었다고 주장한다. 우리가 볼거야.

+0

나는 동일한 문제를 가지고 있으며 Leaves 클래스를 포함하여 PDF를 제시하는 여러 가지 방법을 시도했다. 결과는 항상 같았고 결국 8-9 PDF를로드 한 후에 앱이 다운되었습니다. 귀하의 게시물을 본 후 IOS 5에서 시도하기를 기다릴 수 없습니다. –

+0

@rgeorge가 지금 고쳐 졌습니까? – KarenAnne

+0

문제의 링크와 Apple의 답변은 무엇입니까? – SteakOverflow

1

사용자 : "drawnonward"이 (가) 뭔가있는 것 같습니다. 코드를 살펴보면, 각 버튼을 누를 때마다 새로운 웹 뷰를 할당하고 초기화 할뿐만 아니라 새로운 UIViewController와 새로운 UINavigationController를 생성 할 수 있습니다. 단추를 누를 때마다 이러한 각 개체의 새 인스턴스를 만드는 것이 절대적으로 필요한 경우가 아니라면 각 개체의 인스턴스가 하나만 있도록 코드를 다시 작성한 다음 각 단추를 눌러 새로운 내용을 webview에로드합니다. .

저는 이것이 당신의 문제를 해결할 수있는 좋은 기회라고 생각합니다.

+0

...하지만 나는 * 누출하지 않습니다. throwaways로 UINavigationController를 사용하면 다른 곳에 큰 영향을 주었던 OK, apple-endorsed 패턴이며, 자신을 정리하는 한 안전합니다. – rgeorge

+0

나는 당신이 그들을 유출했다는 것을 기억하지 못합니다. NavController, ViewController 및 WebView를 재활용하면 할당량을 최소화 할 수 있으며, 이론적으로 문제를 해결할 수도 있습니다. autorelease로 객체를 설정할 때, 객체로 완료된 두 번째 객체를 해제하지 않고 객체를 풀에 추가합니다. 풀이 비울 때까지 객체는 메모리에 남아 있습니다. 어쨌든, 애플은 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

관련 문제