2011-12-15 2 views
15

몇 가지 작은 PDF를 표시하는 데 사용하는 UIWebView가 있습니다. 사용자가 표에서 뉴스 기사를 선택한 다음 기사 (PDF)가 동일한 화면의 UIWebView에로드됩니다. 첫 번째로드는 항상 잘됩니다. 그런 다음 내가 선택한 다음 항목 (어느 것이 든 관계 없음)에서 앱이 다운됩니다.두 번째 PDF로드 요청에서 UIWebView가 충돌 함

이 나는 ​​각 기사를로드하고있어 방법은 다음과 같습니다

NSString *filePath = [[NSBundle mainBundle] pathForResource:articleFileName ofType:@"pdf"]; 
[articleView stopLoading]; 
[articleView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]]; 

충돌은 loadRequest 라인 후에 발생합니다.
크래시는 오류 정보를 제공하지 않습니다. 기타 이상 :.

모든 예외 {} 0x3629f000

Catchpoint 3 (발생한 예외) (GDB)

그냥 메인에 충돌(). 디버거에서 각 요청에 올바른 파일 경로를 사용하고 있는지 확인했습니다.

NSZombies가 실행 중이고 모든 예외에 대해 중단 점이 설정되어 있습니다.

+0

웹보기 대리인이 변경됩니까? – amattn

+0

대리인이 자체 (IB를 통해 유선)로 변경되지 않습니다. – Dancreek

+0

충돌 이전에 호출 된 4 가지 대리자 메서드 중 어떤 것입니까? – amattn

답변

34

이 정확한 문제도 있습니다. 스티브에게 큰 도움을주었습니다. 스티브는 제가 그것을 더욱 좁힐 수 있도록 도와주었습니다. 제 예외는 그의 것과 같습니다.

모든 예외 설정이 중단 되었습니까? 그 중단 점을 비활성화하면 더 이상 충돌하지 않는다는 것을 발견했습니다. 어느 날 새로운 디버거 또는 iOS 버전의 버그 일 뿐이라고 생각합니까? iOS 4.3.x 또는 4.3 시뮬레이터가 장착 된 장치에서 실행할 때이 충돌이 발생하지 않는다고 생각하는 또 다른 문제가 있습니다.

+5

"모든 예외 중단"중단 점을 사용하지 않으면 스택 추적에 UIWebPDFView _removeBackgroundImageObserverIfNeeded가 발생하여 내 문제가 해결되었습니다. 중단 점이 충돌을 일으킬 것이라고 누가 생각할 것입니까? – ransomweaver

+4

중단 점을 치면 디버거에서 계속 진행할 수 있습니다. 아마도 애플 코드에서 잡히고 처리되는 예외가있을 수 있습니다. 따라서 예외를 통해 브레이크 포인트가 발생하더라도 충돌이 발생하지는 않습니다. –

+1

이 "버그"가 나를 미치게 만들었습니다. 대답에 대해 매우 감사드립니다. –

9

PDF를로드 한 후 또는 PDF를로드 한 후 HTML을로드하는 동안 webview를 해제하는 동안 비슷한 것을보고 있습니다. rdar : // 10431759로 표시됩니다 (http://openradar.appspot.com/10431759 참조). 나는 그 문제를 해결할 방법이 없다. 나는 pdf를로드 한 다음 html 문자열 @"<div></div>"을로드함으로써 재현 할 수 있으므로 위임 문제로 보이지 않습니다.

당신은 GDB 콘솔에 "BT"를 입력하면

, 당신은을 포함하여, 실제 스택 트레이스를 얻을 수 있습니다

#0 0x37ccd1c8 in objc_exception_throw() 
#1 0x381817b8 in +[NSException raise:format:arguments:]() 
#2 0x381817b8 in +[NSException raise:format:arguments:]() 
#3 0x381817da in +[NSException raise:format:]() 
#4 0x35462628 in -[NSObject(NSKeyValueObserverRegistration) _removeObserver:forProperty:]() 
#5 0x35462296 in -[NSObject(NSKeyValueObserverRegistration) removeObserver:forKeyPath:]() 
#6 0x31fc3448 in -[UIWebPDFView _removeBackgroundImageObserverIfNeeded:]() 
#7 0x31fc36a8 in -[UIWebPDFView dealloc]() 
#8 0x37cc90c4 in _objc_rootRelease() 
#9 0x31dd2614 in -[UIWebPDFViewHandler clearAllViews]() 
#10 0x31d76708 in -[UIWebPDFViewHandler _replacePDFViewIfPresentWithWebDocView:]() 
#11 0x31d766a6 in -[UIWebPDFViewHandler _removePDFViewIfWebDocViewIsNotPDF:]() 
#12 0x31d76644 in -[UIWebBrowserView webView:didFirstVisuallyNonEmptyLayoutInFrame:]() 

장치에서 디버깅, 당신은 "프레임 0"를 입력하고 "포 $ R0" 예외 메시지를보고 : (나는 그것을 "포 $ eax에"이 시뮬레이터 생각합니다.)

(gdb) frame 0 
#0 0x37ccd1c8 in objc_exception_throw() 
(gdb) po $r0 
Cannot remove an observer <UIWebPDFView 0x4a3200> for the key path "backgroundImage" from <UIPDFPageView 0x4a4bf0> because it is not registered as an observer. 

편집 : 나는 "던짐에 브레이크"가있을 때이 문제는 보인다가 발생하는 Objective-에 대해 설정 C 예외.

0

비슷한 문제가 있습니다. 내 UIWebView이 걸려 있습니다. (끝나지 않은 회전하는 '로딩'서클이있는 회색 화면에서만 멈춤). 내가 프로그램을 종료하면 두 번째로드 할 때 충돌이 발생합니다.

마지막으로 필자는 어플리케이션 리소스 번들에서 레이블 글꼴 (CCLabelTTF을 사용하여 Cocos2d)을로드하고 나서 PDF를로드하려고 시도했다면 작동 할 것임을 알았습니다. 충돌하지 않을 것이다.

아주 못생긴 해킹이지만 다른 사람이 유용하다고 생각할 수도 있습니다.

// HACK: Loading a TTF font first is needed to properly load PDF/HTML 
CCLabelTTF* label = [CCLabelTTF labelWithString:@"Testing" fontName:@"DIN-Black" fontSize:12]; 
[label setVisible:false]; 

// We never actually use the label -- we just create it so that it loads the font 
NSString *path = [[NSBundle mainBundle] 
        pathForResource:myPDF 
        ofType:@"pdf"]; 

CCLOG(@"Retrieving PDF from '%@'", path); 

NSURL *pdfUrl = [NSURL fileURLWithPath:path]; 
NSURLRequest *request = [NSURLRequest requestWithURL:pdfUrl]; 

[webView loadRequest:request]; 
[webView setScalesPageToFit:YES]; 
[super onEnter]; 
관련 문제