2016-02-16 16 views
6

Sau một số thay đổi tương đối an toàn (đối với tôi), ứng dụng đã bắt đầu gặp sự cố trên một số nội dung WebKitLegacy. Tôi thấy nhiều sự cố trong Fabric nhưng không thể tìm thấy các bước ổn định để tái sản xuất. Có ai biết điều gì có thể gây ra những sự cố đó không? Vui lòng xem hình ảnh đính kèm.iOS: WebKitLegacy bị treo

Một số màn hình ứng dụng sử dụng UIWebView để hiển thị nội dung - Tôi giả định rằng sự cố ở đâu đó ở đó.

enter image description here enter image description here

+0

được bạn nhắm mục tiêu gì iOS phiên bản? Bạn đang gọi 'webview.delegate = nil' và '[webview stopLoading]' ở đâu? – JAL

+0

Tôi đang nhắm mục tiêu iOS7 +. Có lẽ phiên bản tiếp theo sẽ là 8+. delegate = nil được gọi trong dealloc. stopLoading được gọi trong chế độ xemWillDisappear. – Division

+0

Tôi khá chắc chắn đây là lỗi nội bộ của webkit (xuất hiện trong iOS 7 nhưng đã được sửa bằng iOS 8), nơi giải pháp chính thức từ Apple sẽ là "nâng cấp lên iOS 8." Tôi cũng sẽ thử thay đổi bất cứ nơi nào bạn đang gọi 'webview.delegate = nil' và' [webview stopLoading] ', thử gọi nó trong' viewWillDisapear' hoặc 'dealloc'. – JAL

Trả lời

1

Theo như tôi nhớ, rằng tín hiệu popped lên khi một webview nhận một bản cập nhật (ví dụ, một phản ứng từ một hình ảnh nhúng), nhưng nó không thể được trả lại bởi vì nó không được sử dụng bởi chủ đề chính nữa. Điều đó có nghĩa, khi ViewController không được hiển thị.

Nếu trường hợp đó xảy ra, bạn có thể tạo lại vấn đề bằng cách tải trang web có nội dung nặng (ví dụ: một số tờ báo trực tuyến như http://edition.cnn.com/) và loại bỏ chế độ xem web ngay sau khi bắt đầu tải. ViewController.

Làm thế nào để sửa chữa nó: thật vậy, bạn cần phải gọi những phương pháp bạn đề cập:

webview.delegate = nil; 
[webview stopLoading]; 

Tuy nhiên, nơi để làm như vậy là vào phương pháp viewWillDisappear, không bao giờ trên dealloc. Lý do rất đơn giản: viewWillDisappear được gọi vào đúng thời điểm mà ViewController sắp mất kiểm soát của chuỗi chính. Tuy nhiên, dealloc được gọi khi VC sắp được phát hành vào heap. Điều này có thể xảy ra vài giây sau, khiến ứng dụng mất thời gian quý báu, hoặc có thể sẽ không bao giờ được gọi. Di chuyển cả hai phương pháp có nên làm các trick.

+1

Hãy cẩn thận khi gọi 'webview.delegate = nil' trong' viewWillDisappear' bởi vì nếu trình điều khiển chế độ xem của bạn có chế độ xem web đẩy bất kỳ trình điều khiển chế độ xem nào khác, bạn sẽ mất đại biểu khi trình điều khiển chế độ xem đó được bật lên và người dùng quay lại màn hình xem web. Một cách tiếp cận để sửa lỗi này có thể là đặt lại 'delegate' trong' viewWillAppear'. –

+0

Bạn hoàn toàn đúng :) Cảm ơn bạn đã làm rõ! – Bartserk

1

UIWebView EXC_BAD_Address ... Ứng dụng nhận được tín hiệu Trước hết, bạn nên suy nghĩ về webView.delegate = nil. Nhưng ở đâu ??

Kinh nghiệm của tôi:

- (void)dealloc{ 
    /* 
    Important 
    Before releasing an instance of UIWebView for which you have set a delegate, 
    you must first set the UIWebView delegate property to nil before disposing of the UIWebView instance. 
    This can be done, for example, in the dealloc method where you dispose of the UIWebView. 
    */ 
    if (_webView.loading) { 
     [self.webView stopLoading]; 
    } 
    _webView.delegate = nil; 
} 

nếu ViewController là con của một ViewController khác, bạn có thể kích hoạt việc loại bỏ các ViewController 'xem s từ cha mẹ ViewController' s xem với một hình ảnh động . Đồng thời, bạn có thể xóa số ViewController khỏi cha mẹ và không tham chiếu. vào thời điểm này ViewControllersẽ nilviewWillDisappearsẽ không bao giờ được gọi là, có nghĩa ** các đại biểu WebView sẽ không bao giờ được làm sạch lên ** Sử dụng dealloc và đảm bảo rằng WebView của bạn luôn được dọn dẹp.

khác tuyệt vời nối ios:EXC_BAD_ACCESS for Webview delegate

Các vấn đề liên quan