2016-02-16 14 views
6

कुछ अपेक्षाकृत सुरक्षित (मेरे लिए) संशोधनों के बाद ऐप कुछ वेबकिट लिगेसी सामानों पर दुर्घटनाग्रस्त हो गया। मुझे फैब्रिक में कई दुर्घटनाएं दिखाई देती हैं लेकिन पुनरुत्पादन के लिए स्थिर कदम नहीं मिल पा रहे हैं। क्या किसी को पता है कि उन दुर्घटनाओं का कारण क्या हो सकता है? कृपया संलग्न छवियों को देखें।आईओएस: वेबकिट लिगेसी क्रैश

कुछ ऐप स्क्रीन सामग्री प्रदर्शित करने के लिए UIWebView का उपयोग करती हैं - मुझे लगता है कि समस्या कहीं कहीं है।

enter image description here enter image description here

+0

आप लक्षित कर रहे क्या iOS संस्करण? आप 'webview.delegate = nil' और '[वेबव्यू स्टॉपलोडिंग] कहां कह रहे हैं? – JAL

+0

मैं आईओएस 7 + को लक्षित कर रहा हूं। शायद अगला संस्करण 8+ होगा। प्रतिनिधि = शून्य को डेलोक में बुलाया जाता है। स्टॉपलोडिंग को देखने में कहा जाता है WillDisappear। – Division

+0

मैं बहुत यकीन है कि यह एक वेबकिट आंतरिक बग (कि iOS 7 में दिखाई दिया लेकिन आईओएस 8 के साथ तय हुई थी) जहां एप्पल से आधिकारिक समाधान "iOS 8. में नवीनीकृत करने के लिए" हो जाएगा हूँ मैं भी बदल रहा है जहाँ भी आप कॉल कर रहे हैं की कोशिश करता हूँ 'webview.delegate = nil' और' [वेबव्यू stopLoading] ',' viewWillDisapear' या 'dealloc' में यह कॉल करने का प्रयास। – JAL

उत्तर

1

जहाँ तक मुझे याद है के रूप में, कि संकेत ऊपर पॉप जब एक वेब-दृश्य (एक एम्बेडेड छवि से एक प्रतिक्रिया उदाहरण के लिए,) एक अद्यतन प्राप्त, लेकिन क्योंकि यह उपयोग नहीं किया जाता यह गाया नहीं किया जा सका मुख्य धागे से अब और। इसका मतलब है, जब ViewController प्रदर्शित नहीं किया जा रहा है।

अगर ऐसी बात है, तो आप (उदाहरण के लिए, http://edition.cnn.com/ जैसे कुछ ऑनलाइन समाचार पत्र) भारी सामग्री के साथ एक वेब पेज लोड हो रहा है और लोड शुरू करने के बाद तुरंत वेबव्यू खारिज, धक्का/एक और पॉपिंग के द्वारा समस्या को ठीक करने में सक्षम होना चाहिए ViewController।

इसे कैसे ठीक करें: वास्तव में, आप तरीकों आप का उल्लेख कॉल करने की आवश्यकता:

webview.delegate = nil; 
[webview stopLoading]; 

हालांकि, ऐसा करने के लिए जगह है, viewWillDisappear पद्धति पर है dealloc पर कभी नहीं। कारण सरल है: viewWillDisappear को उस सटीक पल पर बुलाया जाता है जहां व्यू कंट्रोलर मुख्य धागे का नियंत्रण खोने वाला है। हालांकि, dealloc को तब कहा जाता है जब वीसी ढेर पर रिलीज होने वाला है। यह कुछ सेकंड बाद हो सकता है, ऐप को क्रैश करने के लिए कुछ मूल्यवान समय दे रहा है, या शायद कभी भी कॉल नहीं किया जाएगा। दोनों तरीकों को स्थानांतरित करने से चाल चलनी चाहिए।

+1

बुला 'webview.delegate =' viewWillDisappear' में nil' बारे में सावधान रहें क्योंकि अगर किसी वेब दृश्य के साथ अपने दृश्य नियंत्रक किसी अन्य दृश्य नियंत्रक धक्का, आप प्रतिनिधि खो देंगे जब उस दृश्य नियंत्रक पॉप किया गया है और उपयोगकर्ता वेब व्यू स्क्रीन पर वापस आ गया है। इसे ठीक करने का एक दृष्टिकोण 'viewWillAppear' में 'प्रतिनिधि' को फिर से सेट करना हो सकता है। –

+0

आप बिल्कुल सही कर रहे हैं :) स्पष्टीकरण के लिए धन्यवाद! – Bartserk

1

UIWebView EXC_BAD_Address ... आवेदन प्राप्त संकेत सबसे पहले, आपको webView.delegate = nil के बारे में सोचना चाहिए। लेकिन कहाँ ??

मेरा अनुभव:

- (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; 
} 

अगर ViewController एक अन्य ViewController का एक बच्चा है, तो आप एक एनीमेशन के साथ दृश्य ' ViewController माता पिता से दृश्य' ViewController को हटाने ट्रिगर कर सकते हैं । उसी समय, आप अपने माता-पिता से ViewController हटा सकते हैं और इसके संदर्भ को बाहर कर सकते हैं। इस बिंदु ViewControllerपर किया जाएगा शून्य और viewWillDisappear कभी नहीं बुलाया जाएगा, जिसका अर्थ है ** WebView प्रतिनिधि ऊपर कभी नहीं साफ हो जाएगा ** उपयोग dealloc और सुनिश्चित करें कि आपके WebView हमेशा साफ किया जाता है।

अन्य उत्कृष्ट जोड़ने ios:EXC_BAD_ACCESS for Webview delegate

संबंधित मुद्दे