2010-11-13 13 views
7

मैं अपने ऑब्जेक्ट की init विधि में NSUserDefaults से लोड करता हूं। क्या मैं अपने ऑब्जेक्ट की डेलोक विधि में NSUserDefaults को सहेज सकता हूं?क्या एनएसयूसर डीफॉल्ट को सिंक्रनाइज़ करने के लिए यह खराब फॉर्म है - (शून्य) dealloc?

कुछ वास्तव में चाहते:

-(void)dealloc { 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setObject:self.filenamesArray forKey:self.defaultsKey]; 
    [userDefaults synchronize]; 
    self.filenamesArray = nil; 
    self.defaultsKey = nil; 
    [super dealloc]; 
} 

अच्छा है, बुरा, ठीक है? यदि यह अच्छा नहीं है, तो बेहतर होगा।

संपादित करें:

विस्तृत प्रतिक्रिया के लिए धन्यवाद। उन सभी चीजों को समझ में आता है। एक और कारण मैंने पाया कि यह उपयोगकर्ता डिफ़ॉल्ट को सहेजने के लिए एक बुरी जगह क्यों है, यह है कि डेलोक केवल तभी बुलाया जाता है जब कोई ऑब्जेक्ट अच्छी तरह से खराब हो जाता है। अगर मेरा ऐप मारे गए, तो यह कोड कभी नहीं चलता है। इसी प्रकार, यदि ऐप को पृष्ठभूमि में धक्का दिया जाता है (आईओएस 4) यह नहीं चलता है। मैंने स्पष्ट [userDefaults synchronize] कॉल भी हटा दिया है। यह मुझे थोड़ा परेशान करता है, लेकिन मैंने इस पर सेब में मेरा विश्वास रखा है। :)

उत्तर

7

यह बुरा है क्योंकि समय -dealloc कहा जाता है, अन्य वस्तुओं ने इसमें रुचि छोड़ दी है। इसमें कई अलग-अलग प्रभाव हो सकते हैं।

उपयोगकर्ता डिफ़ॉल्ट सेट करने के लिए बेहतर जगह एक सेटिंग बदलती है। इस तरह यह तुरंत जारी रहा है और एप को मार दिया जा सकता है क्योंकि सेटिंग को जारी रखने के बारे में कोई चिंता नहीं है क्योंकि आपके ऑब्जेक्ट ग्राफ के कुछ भाग पहले से ही चले गए हैं।

0

-dealloc में उपयोगकर्ता डिफ़ॉल्ट को सिंक्रनाइज़ करना कहीं और से अलग नहीं है। ऐसा इसलिए है क्योंकि, ऐसा लगता है कि पागल हो सकता है, -dealloc किसी भी तरह जादुई नहीं है, और विपरीत, कहते हैं, सी ++ विनाशक, -dealloc वास्तव में वास्तव में एक ठेठ विधि है। आप self.filenames को पार करने के बारे में थोड़ा अधिक चिंतित हो सकते हैं उपयोगकर्ता को अपरिवर्तनीय, क्योंकि वास्तव में ऐसा कुछ है जो वास्तविक डेलोकेशन के पीछे हो सकता है, लेकिन मुझे विश्वास है कि उपयोगकर्ता डिफ़ॉल्ट इसे बरकरार रखता है।

जब आपको [userDefaults synchronize]; होना चाहिए, तो लोग अलग-अलग होते हैं, और मैं व्यक्तिगत रूप से @ जोशुआ से असहमत हूं - मैं कभी स्पष्ट रूप से सिंक्रनाइज़ नहीं करता हूं, बल्कि एनएसयूसर डीफॉल्ट को इसकी देखभाल करने देता हूं। जब तक कि मैं बहुत गलत नहीं हूं, जब ऐप बंद हो जाता है, साथ ही समय-समय पर यह स्वचालित रूप से आग लग जाता है। जैसा कि यह जानता है कि इसे कब अपडेट किया गया है, और इसे एक बार में पूरी प्लिस्ट फ़ाइल लिखने की ज़रूरत है, मुझे लगता है कि जब मैं डिफ़ॉल्ट लिखने का समय देता हूं तो ऐप्पल के अल्गोस को संभालने की बजाय, क्योंकि यह गैर-तुच्छ समय लेता है (क्योंकि यह फाइल सिस्टम को लिखता है)।

(नोट अंतिम अनुच्छेद में से कोई भी/उन्हें लिखित रूप से लागू होता है कि आप अपने उपयोगकर्ता चूक, आसपास के विशेष परिस्थितियों अगर इस तरह के एक अन्य आवेदन पढ़ने के रूप में)

+0

मैं जारेड से सहमत हैं, 'synchronize' केवल" बल को इस्तेमाल किया जाना चाहिए "सिंकिंग। यह उदाहरण के लिए उपयोगी हो सकता है जब डीबगिंग और क्रैश होने का मौका होता है, आदि – mohsenr

+0

मुझे किसी को भी "जादुई" के रूप में प्रस्तुत करने वाले किसी को याद नहीं है। मुद्दा यह है कि यह आमतौर पर खराब अभ्यास है क्योंकि विशेष रूप से आपके ऑब्जेक्ट ग्राफ़ का यह हिस्सा टूट रहा है। आंसू के अलावा कुछ भी करना (जैसे अधिसूचना केंद्र से स्वयं को हटाने आदि) आपके आवेदन का एक और क्षेत्र बनाता है जो आपकी कक्षा के रूप में गलत हो सकता है क्योंकि आपकी कक्षा अधिक जटिल हो जाती है। विशेष रूप से जब आप अन्य वस्तुओं के कमजोर संदर्भों पर विचार करते हैं जो इस ऑब्जेक्ट के समय-समय पर अलविदा कहलाते हैं। कोड अब यह हानिरहित दिखता है लेकिन यह आसानी से बदल सकता है। –

+0

उपरोक्त ने कहा (कमरे से बाहर चला गया), मैं मानता हूं कि कॉल-सिंक्रनाइज़ करने के लिए कॉल अनावश्यक है, हालांकि उपयोगकर्ता डिफ़ॉल्ट को सेट करना वह है जो मुझे मुख्य रूप से समस्या है। ओपी सिंक्रनाइज़ नहीं कर रहा है, वह एक-डेलोक कॉल के दौरान डिफ़ॉल्ट सेट करने का इंतजार कर रहा है। इस भेद को दर्शाने के लिए मैंने अपने मूल उत्तर के शब्द को बदल दिया है। –

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

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