मेरे ऐप में मैं चूक डेटाबेस के लिए कई तार लिखते हैं, इस तरह:NSUserDefaults एक deallocated स्ट्रिंग क्यों देता है? (अद्यतन # 2)
[[NSUserDefaults standardUserDefaults] setObject:@"Hi" forKey:@"GREETING"];
मेरे एप्लिकेशन का जीवन काल के दौरान इस पर कई बार फोन, तो मैं ऊपर में किसी त्रुटि के साथ समाप्त और अधिक विस्तार में
NSString *val = [[NSUserDefaults standardUserDefaults] objectForKey:@"someKey"];
यहाँ: इस कोड पर कदम के बाद सांत्वना
आप मैं बिल्कुल +०१२३९७०६५९२४ लिए विधि कॉल के साथ लाइन पर एक ब्रेकपाइंट देख सकते हैं जैसाके। कदम उठाने के बाद, दुर्घटना पहले से ही होती है! val
में जो भी है उसे पढ़ने का कोई मौका नहीं है। इसे हटा दिया गया है!
यह किसी भी स्ट्रिंग के साथ होता है जिसे मैंने एनएसयूसर डीफॉल्ट में रखा है, और मैं स्मृति प्रबंधन के साथ कुछ भी गलत नहीं कर रहा हूं। लीक्स इंस्ट्रूमेंट क्लेंग स्टेटिक विश्लेषक के परिणाम के समान ही सही है।
कंसोल त्रुटि:
*** -[CFString retain]: message sent to deallocated instance 0x610ba10
दुर्घटना के बाद डीबगर में स्टैक ट्रेस के शीर्ष पर: (शीर्ष पंक्ति पढ़ता अग्रेषण)
मशीन कोड प्रतीक:
अब वास्तव में अजीब हिस्सा: मेरे पास एक व्यू कंट्रोलर है जो एक भारी यूआई लोड करता है। जब मैं इस दृश्य को नष्ट करता हूं और इसे लोड करता हूं, और इसे फिर से नष्ट करता हूं और इसे फिर से लोड करता हूं, तो NSUserDefaults मर चुका है। जैसे ही मैं NSUserDefaults से एक स्ट्रिंग पढ़ना चाहता हूं क्रैश करें। यह बिल्कुल बिल्कुल सही व्यवहार है।
मैंने सोचा कि शायद एक स्मृति रिसाव है जो सभी रैम खाती है। लेकिन यह एक बड़ी विकास मशीन के साथ-साथ आईपैड पर भी होता है। दृश्य को दो बार रिलीज़ और पुनः लोड करें और एनएसयूसर डीफॉल्ट में यह दोष है।
बस यह मेरी गलती नहीं है सुनिश्चित करने के लिए, मैं अपने NSUserDefaults कुछ इस तरह करने के लिए कोड लिखने को फिर से लिखा है:
[[NSUserDefaults standardUserDefaults] setObject:[theString copy] forKey:key];
लेकिन फिर भी, मैं NSUserDefaults से पुनः आवंटित की जाती स्ट्रिंग उदाहरणों हो रही के साथ खत्म! सिम्युलेटर और डिवाइस पर! इसके अलावा, उन तार का उपयोग करने के लिए मैं कोशिश से कुछ डिफ़ॉल्ट के रूप में जब + (void)initialize
NSDictionary *preSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
@"Hollywood", @"defaultCity",
nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:preSettings];
में आवेदन आरंभ इसलिए भले ही मैं कुंजी "@ defaultCity के लिए इस स्ट्रिंग में परिवर्तन नहीं करते लिखा गया है और मैं के बाद इसे उपयोग करना चाहते थोड़ी देर (जब मैंने उस वसा दृश्य को दो बार फिर से लोड किया), तो मुझे एनएसयूसर डीफॉल्ट से एक विलुप्त उदाहरण मिल गया।
मैंने पूरी चीज को फिर से शुरू करने की कोशिश की, मैन्युअल रूप से ऐप डिलीगेट में अपनी विधि को कॉल करने का प्रयास किया जो डिफ़ॉल्ट शब्दकोश को पंजीकृत करता है NSUserDefaults के साथ। कुछ भी मदद नहीं करता है।
मैंने 100% सुनिश्चित किया है कि वें ईर कोई स्मृति रिसाव नहीं है (लीक उपकरण के साथ अत्यधिक परीक्षण किया जाता है)। मुझे यह नहीं मिलता है कि ऐसा क्यों होता है।मैंने बिना किसी सफलता के एनएसयूसर डीफॉल्ट (जो कि बेवकूफ होगा) को लिखने से पहले 5 बार उन तारों को बनाए रखने की कोशिश की थी।
विचार?
समस्या हल हो गई!
NSUserDefaults द्वारा लौटे तारों में से एक को बनाए रखने वाली संपत्ति को सौंपा गया था। मैं के सामने self.
जोड़ना भूल गया जिसके परिणामस्वरूप उस स्ट्रिंग को ओवर-रिलीज़ किया गया था जब दृश्य को हटा दिया गया था।
अजीब हालांकि, कि मैं उस दृश्य को लोड, नष्ट, लोड, नष्ट करने में सक्षम था। और फिर यह NSUserDefaults से किसी भी स्ट्रिंग को पढ़ने के पहले प्रयास पर हुआ। यह एक डेलोकॉटेड स्ट्रिंग की तरह है जो डिफ़ॉल्ट शब्दकोश या डिफ़ॉल्ट डेटाबेस के माध्यम से प्रचार करता है और एनएसयूसर डीफॉल्ट और एनएस डिक्शनरी एल्गोरिदम को नाटकीय रूप से चलाते हुए सब कुछ नीचे आँसू देता है।
उस त्रुटि को ठीक करने के बाद सब ठीक काम किया। NSUserDefaults में अन्य सभी तारों तक पहुंच सहित। काम करता है, लेकिन फिर भी एक रहस्य यह कैसे भूल गया कि self.
का इतना बड़ा प्रभाव पड़ा।
इस समस्या को हल करने में आपकी सहायता करने वाले सभी को धन्यवाद। आपने मुझे दिल के दौरे से बचाया। मैं इसके बहुत करीब था। खैर, अब कुछ नई चीजें खरीदनी होंगी ... मेरा कार्यालय गोवाल्ड हमले के बाद स्टार गेट रूम की तरह दिखता है।
क्या आप NSUserDefaults में स्ट्रिंग को सहेजने के लिए अपना कोड पोस्ट कर सकते हैं? – iMOBDEV
हां, कृपया मेरा अद्यतन उत्तर देखें। – openfrog