5

मेरे पास कुछ कोड है जो केवीओ का भारी उपयोग करता है और addObserver: forKeyPath: और निकालें ओब्सर्वर: केकेपाथ: कई स्थानों पर। ऐप कभी-कभी "मुख्य पथ के लिए पर्यवेक्षक को हटा नहीं सकता" के साथ दुर्घटनाग्रस्त हो जाएगा।[NSObject removeObserver: forKeyPath:] से अपवाद पकड़ना सुरक्षित है?

मैं सोच रहा था कि ऐप को क्रैश होने से रोकने के लिए अपवाद को आजमाएं/पकड़ना सुरक्षित होगा या नहीं। मुझे पता है कि केवीओ को संभालने में यह सबसे अच्छा तरीका नहीं है लेकिन कोड को साफ करने से पहले मुझे कुछ समय खरीदने की ज़रूरत है।

+2

आपको शायद असफलताओं की प्रकृति को समझने की कोशिश करनी चाहिए और यह तय करना चाहिए कि आप इसे अनदेखा कर सकते हैं या नहीं। कोशिश करें/पकड़ने में मदद मिलेगी यदि आप ऐसा निर्णय लेते हैं: http://stackoverflow.com/questions/1582383/how-can-i-tell-if-an-object-has-a-key-value-observer-attached – Tala

उत्तर

5

अपवाद, विशेष रूप से आंतरिक ऐप्पल एपीआई से, कभी चुपचाप पकड़ा और अनदेखा नहीं किया जाना चाहिए। उद्देश्य-सी में एक अपवाद आमतौर पर आपके ऐप को समाप्त करने का कारण बनता है, अन्य भाषाओं और रनटाइम्स (जावा, .NET) के विपरीत जहां अपवाद पकड़ना विकास का एक सामान्य हिस्सा है।

यदि आपको कोई दुर्घटना हो रही है, तो आपके पास कहीं भी एक बग है और आपको इसे ठीक करने की आवश्यकता है। अपवाद को निगलने के कारण असंगत राज्य में आने के कारण बहुत खराब परिणाम हो सकते हैं। ऐसा मत करो

+0

तो आपका अनुशंसा कोड को साफ करना है, भले ही उसे अतिरिक्त समय की आवश्यकता हो और रिलीज में देरी हो? जैसा कि मैंने उल्लेख किया है, मुझे समझ में आता है कि मुझे अपना कोड ठीक करने की आवश्यकता है। बस इस बिंदु पर अर्थशास्त्र का काम करने की कोशिश कर रहा है। धन्यवाद –

+1

@JihoKang तो आप एक ऐप भेजना चाहते हैं जिसमें एक स्पष्ट बग है? क्या आप यह भी जानते हैं कि प्रभाव क्या होंगे? अभी ऐप क्रैश हो रहा है; जब आप अपवाद निगलते हैं तो आपका ऐप क्या करने जा रहा है? – Abizern

+0

@Abizern जिस परियोजना पर मैं काम कर रहा हूं वह समय महत्वपूर्ण है और क्रैश बग (जहां तक ​​मैंने बीटा टेस्टर्स के साथ देखा है) केवल 5% के तहत होता है। मैंने कोड लिखा है ताकि समय के मुद्दों के कारण मामले हो, जिसमें एक वस्तु जो केवीओ से पहले ही पंजीकरण नहीं कर चुकी है, फिर से पंजीकरण रद्द करने का प्रयास करेगी। मैंने "मुख्य पथ के लिए पर्यवेक्षक को हटा नहीं सकता" को पकड़ने का परीक्षण किया है। साइड इफेक्ट्स के बिना अपवाद "जहां तक ​​मैं देख सकता हूं" लेकिन यह सोच रहा था कि यह वास्तव में कितना महत्वपूर्ण हो सकता है। माइक ने बताया कि जावा में यह सामान्य प्रथा है। –

3

हां, केवीओ संघर्षों के इन प्रकारों को हल करने के लिए @try @catch का उपयोग करने के लिए यह पूरी तरह से स्वीकार्य हो सकता है।

उदाहरण के लिए:

@try { 
     [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:UIDeviceProximityStateDidChangeNotification]; 
    } 
@catch (NSException *exception) { 
     // observer doesn't exist, do nothing 
    } 

उत्पादन के लिए सुरक्षित है और एक उचित अपवाद हैंडलिंग पद्धति के रूप में एप्पल द्वारा सुझाव दिया है।

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