2009-10-05 31 views
23

Tôi vừa tải xuống báo cáo sự cố cho một trong các ứng dụng iPhone của mình từ iTunes Connect. Tai nạn phổ biến nhất có dấu vết như sau:EXC_BAD_ACCESS trong UIWebView

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0xa1b1c1db 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libobjc.A.dylib     0x3030e6f4 objc_msgSend + 16 
1 UIKit       0x30ebebee -[UIWebView webView:resource:didFinishLoadingFromDataSource:] 
2 UIKit       0x30ebe5ca -[UIWebViewWebViewDelegate webView:resource:didFinishLoadingFromDataSource:] 
3 CoreFoundation     0x32b73b5c __invoking___ + 60 
4 CoreFoundation     0x32bc67be -[NSInvocation invoke] 
5 WebCore       0x320baa86 HandleDelegateSource 
6 CoreFoundation     0x32bb8a96 CFRunLoopRunSpecific 
7 CoreFoundation     0x32bb8356 CFRunLoopRunInMode 
8 GraphicsServices    0x30544cd4 GSEventRunModal 
9 GraphicsServices    0x30544d80 GSEventRun 
10 UIKit       0x30d2c768 -[UIApplication _run] 
11 UIKit       0x30d2b46c UIApplicationMain 

Tôi chắc chắn 80% đây là vấn đề bên trong UIWebView và ngoài phạm vi những gì tôi có thể giải quyết. Có ai có bất kỳ đề xuất nào về cách thu hẹp vấn đề này để giúp xác định xem đó có phải là sự cố với HĐH và UIWebView hay vấn đề mà tôi có thể khắc phục và giải quyết trong mã của mình không? Cảm ơn trước.

CẬP NHẬT: UIWebView được đề cập nằm trong chế độ xem được phát hành khi người dùng nhấn vào nút quay lại của bộ điều khiển điều hướng tương ứng. Các giải pháp được chấp nhận dường như cung cấp một lời giải thích tốt cho lý do tại sao lỗi này xảy ra.

Trước khi giải pháp đề nghị:

- (void)dealloc { 
    [webView release]; 

    [super dealloc]; 
} 

Sau giải pháp đề nghị:

- (void)dealloc { 
    webView.delegate = nil; 
    [webView stopLoading]; 
    [webView release]; 

    [super dealloc]; 
} 

Trả lời

53

Kịch bản đi một cái gì đó như thế này:

  1. tài vào màn hình với UIWebView. UIViewController đặt self làm đại biểu
  2. Trang web bắt đầu tải xuống
  3. Màn hình thoát người dùng 3a. UIViewController được deallocated
  4. UIWebView kết thúc tải và gửi "Tôi đã hoàn thành" tin nhắn đến đại biểu của nó ...

Bạn cần phải ngăn chặn UIWebView tải trang của nó và đặt đại biểu của mình để nil trước khi bạn deallocate các đại biểu.

+2

Tôi sẽ bỏ tiền cho một đại biểu được phát hành là nguyên nhân của việc này. –

+0

veyr hữu ích, cảm ơn. –

+0

Đây chính xác là những gì đang xảy ra với tôi, phân tích tuyệt vời. –

1

Đó là gần như 100% một lỗi trong mã của bạn. Lỗi trong iPhone SDK là khá hiếm và UIWebView đã được thử nghiệm khá tốt bởi nhiều nhà phát triển khác.

EXC_BAD_ACCESS thường xảy ra khi bạn cố gắng truy cập một đối tượng đã được phát hành. Rõ ràng nếu mã của Apple đang cố gắng để làm điều đó bạn là một trong những người đã phát hành các đối tượng sai. Bạn có chắc chắn không có -autorelease hoặc -release quá nhiều không?

+2

nhắc tôi về báo giá Anchorman "60% thời gian hoạt động mỗi lần" – slf

0

Xem xét kỹ hơn nội dung trong mã của bạn đang triển khai giao thức UIWebViewDelegate. Cụ thể là bạn muốn xem xét bất cứ điều gì đang xử lý webViewDidFinishLoad: Bạn đang cố gắng truy cập một biến được phát hành. Đăng toàn bộ nguồn nếu bạn có thể, điều đó sẽ giúp chúng tôi tìm thấy nó cho bạn.

0

Tôi gặp sự cố tương tự. Tôi đã sử dụng:

[webView loadHTMLString:str baseURL:tmpUrl]; 

[str release]; 

Việc phát hành "str" ​​gây ra thông báo lỗi "EXC_BAD_ACCESS"

1

thời gian gần đây tôi đã có một vấn đề tương tự mà ứng dụng của tôi bị đâm một cách ngẫu nhiên. Hóa ra vấn đề là sử dụng "onclick=" trong HTML đã tải.

Thay thế onclick bằng đơn giản <a href="javascript:some_script"> và sự cố đã biến mất.

Hy vọng điều này sẽ giúp những người khác gặp sự cố tương tự với webviews.