2013-10-21 5 views
7

मुझे पता है कि प्रलेखन कहता है कि यह है, और मुझे पता है कि यह विषय पहले से ही चर्चा में था, लेकिन मेरे पास एक दिलचस्प स्टैक परिणाम है और मैं कुछ और निष्कर्ष निकाल नहीं सकता लेकिन [NSUserDefaults standardUserDefaults] थ्रेडसेफ नहीं है। तो मैं अपने दुर्घटना लॉग पोस्ट और आशा है कि होगा कि किसी कुछ है कि मैं नहीं कर सकता ...एनएसयूसर डीफॉल्ट थ्रेडसेफ

थ्रेड

... 
    libdispatch.dylib 0x3ab53d67 _dispatch_client_callout + 23 
    libdispatch.dylib 0x3ab65e73 _dispatch_barrier_sync_f_invoke + 27 
    CoreFoundation 0x302b470d CFPreferencesAppSynchronize + 265  
    Foundation 0x30151b01 -[NSUserDefaults(NSUserDefaults) synchronize] + 25 
    MyApp 0x0009df8b -[AppDelegate applicationDidEnterBackground:] (AppDelegate.m:178) 
    ... 
    MyApp 0x0005344b main (main.m:17) 
    MyApp 0x000533f8 start + 40 

कुछ अन्य धागा ढेर के

... 
    CoreFoundation 0x302bc13f _CFXPreferencesSetValue + 107 
    CoreFoundation 0x302bc039 CFPreferencesSetAppValue + 41 
    Foundation 0x30c76935 -[NSUserDefaults(NSUserDefaults) setObject:forKey:] + 61 
    MyApp 0x000b2e9d -[AppData parserDidEndDocument:] (AppData.m:1013) 
    ... 

पार्ट्स किया गया है क्रैश हुआ देखता है कटौती और "..." के साथ प्रतिस्थापित इस विषय के लिए बहुत लंबा और अप्रासंगिक है। अनुप्रयोग संदेश के साथ दुर्घटनाओं:

* संग्रह < __NSDictionaryM: 0x15a04ae0> जबकि प्रगणित किया जा रहा उत्परिवर्तित गया था। ....

कोड: AppDelegate: -> crached धागा ...

- (void)applicationDidEnterBackground:(UIApplication *)application 
    { 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 

MyClass: -> दूसरी धागा:

-(void)parserDidEndDocument:(NSXMLParser *)parser { 
    ... 
     [[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"savedStations"]; 
     [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"lastUpdateDate"]; 
     [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"alreadyLoaded"]; 
    ... 
    } 

मैं कुछ इस दुर्घटना है अन्य मामलों में, इसमें हमेशा एक थ्रेड में उपयोगकर्ता डिफ़ॉल्ट को कुछ लिखना शामिल होता है और क्रैश होने वाले अन्य थ्रेड में सिंक्रनाइज़ करना शामिल होता है .. अगर किसी के पास कुछ अन्य स्पष्टीकरण है तो मैं बहुत शानदार होगा ...

+0

खैर अगर है कि "उत्परिवर्तित जबकि प्रगणित किया जा रहा है" त्रुटि उपयोगकर्ता चूक कोड में था तो मैं कहूँगा कि यह सुरक्षित थ्रेड नहीं है। – trojanfoe

+2

आपको 'NSUserDefaults' और आपके कोड से प्रत्येक परिवर्तन के बाद' सिंक्रनाइज़ 'कॉल करना होगा, दूसरा थ्रेड इसे कॉल नहीं कर रहा है। – danypata

+1

@danypata आपको ऐसा क्यों करना है? – trojanfoe

उत्तर

-7

nsuserdefaults थ्रेड सुरक्षित में नहीं। कृपया किसी भी आईओएस शर्तों के लिए थ्रेड सुरक्षित के बारे में चर्चा नहीं करते हैं, तो यह थ्रेड सुरक्षित नहीं है ....

+1

दूसरे उत्तर पर टिप्पणी के अनुसार, दस्तावेज आपके द्वारा दावा किए जाने वाले सटीक विपरीत कहता है। Https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSUserDefaults_Class/Reference/Reference.html देखें और अवलोकन के अंतिम वाक्य को पढ़ें। – Tommy

+0

उन्होंने क्रिसमस पर इसका उत्तर दिया। उसे अपने बुरे मूड के लिए कुछ ढीला करो। – Jameson

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