2010-12-30 12 views
7

मुझे यह पता लगाने में परेशानी हो रही है कि NSUserDefaults मेरे ऐप के लिए लाइब्रेरी/प्राथमिकताओं में जंक प्लेस्ट फ़ाइलों को क्यों छोड़ रहा है।NSUserDefaults मेरे ऐप के लिए लाइब्रेरी/प्राथमिकताओं में अस्थायी प्लिस्ट फ़ाइलों को क्यों छोड़ रहा है?

मैं निम्न फ़ाइलों को दिखाई दे रहा है ...

com.mycompany.myapp.plist 
com.mycompany.myapp.plist.3gaPYul 
com.mycompany.myapp.plist.c97yxEH 

... आदि plist.* फ़ाइलों 0 बाइट्स हैं। ऐसा लगता है कि हर बार ऐप चलाया जाता है, यह पीछे एक नया छोड़ देता है। मैंने सुनिश्चित किया है कि मैं -[NSUserDefaults synchronize] पर कॉल नहीं कर रहा हूं, हालांकि अगर मैं इसे कॉल करता हूं, तो यह किसी दिए गए रन के लिए जंक फाइलों की उपस्थिति को तेज करता है। एक डीबगर में कदम उठाने के साथ ही, जैसे ही मैं सिंक्रनाइज़ करने के लिए कॉल पर कदम उठाता हूं, एक नई फ़ाइल दिखाई दी है। अगर मैं सिंक्रनाइज़ कॉल करता हूं, तो ऐप से दूसरी बार ऐप शुरू होने पर एक नई जंक फ़ाइल दिखाई देती है।

मैं यह देखने के लिए भी जांच कर रहा हूं कि शायद मैं थ्रेड पर उपयोगकर्ता डिफ़ॉल्ट सेट कर रहा हूं (संभावना नहीं है, लेकिन शायद एक संभावना है), सोचा था कि दस्तावेज़ कहते हैं कि यह थ्रेड सुरक्षित है।

किसी भी मदद की सराहना की है। धन्यवाद!

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

बस पाया इस: "क्यों" CFPreferences creates multiple files

जब मैं answerers विचार से सहमत हैं, यह स्पष्ट नहीं होता अंश।

+0

यह बहुत पागल है; अगर आपको कभी पता चल जाए तो मुझे बताएं क्यों! –

+0

मेरे पास एक ही समस्या है, अस्थायी plists वास्तव में आईपैड को पूरी तरह से भरने के समाप्त होने के साथ (कई जीबी का प्रतिनिधित्व करने वाली हजारों ~ 4 एमबी फाइलें)। निश्चित रूप से एक आईओएस बग की तरह दिखता है। – quentinadam

उत्तर

3

मुझे विश्वास है कि यह एक ऐप्पल बग है, लेकिन मैं इसका वर्णन करने वाला एक छोटा सा नमूना तैयार करने में असमर्थ हूं। मुझे फीडबैक का एक टन मिल गया है कि ऐप्पल के अपने ऐप्स ऐसा करते हैं। चूंकि मैंने एक दीवार को मारा है और आगे बढ़ने की जरूरत है, इसलिए मैंने नीचे दिखाया गया एक बुरा हैक कर दिया है।

@implementation NSUserDefaults(Hack) 

- (BOOL)synchronize 
{ 
BOOL result = CFPreferencesAppSynchronize((CFStringRef)[[NSBundle mainBundle] bundleIdentifier]); 
if (!result) 
{ 
    // there's probably a temp file lingering around... try again. 
    result = CFPreferencesAppSynchronize((CFStringRef)[[NSBundle mainBundle] bundleIdentifier]); 

    // regardless of the result, lets clean up any temp files hanging around.. 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSString *prefsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Preferences"]; 
    NSDirectoryEnumerator *dirEnumerator = [fileManager enumeratorAtPath:prefsDir]; 
    NSString *file = nil; 
    NSString *match = [[[NSBundle mainBundle] bundleIdentifier] stringByAppendingString:@".plist."]; 
    while ((file = [dirEnumerator nextObject])) 
    { 
     if ([file rangeOfString:match].location != NSNotFound) 
     { 
      NSString *fileToRemove = [prefsDir stringByAppendingPathComponent:file]; 
      [fileManager removeItemAtPath:fileToRemove error:nil]; 
     } 
    } 
} 

return result; 
} 
+1

मेरे पास एक ही समस्या है, अस्थायी plists वास्तव में आईपैड को पूरी तरह से भरने के समाप्त होने के साथ (कई जीबी का प्रतिनिधित्व करने वाली हजारों ~ 4 एमबी फाइलें)। निश्चित रूप से एक आईओएस बग। – quentinadam

1

क्या ये प्लेस्ट फ़ाइलें एप्लिकेशन लॉन्च के बीच जारी रहती हैं? वरीयताओं को संग्रहीत करते समय क्या आपको त्रुटियां हैं? क्या आपके आधिकारिक प्लिस्ट लिखने की अनुमति सक्षम है?

संपत्ति सूचियों को परमाणु रूप से लिखा जा सकता है, जिसका अर्थ है कि उन्हें पहले अस्थायी फ़ाइल में लिखा गया है और यदि लिखने के दौरान कोई त्रुटि नहीं है, तो अस्थायी फ़ाइल का नाम मूल फ़ाइल नाम में बदल दिया गया है। सामान्य परिस्थितियों में, आपको अस्थायी फ़ाइलों को नहीं देखना चाहिए।

+0

प्लेस्ट फ़ाइलें लॉन्च के बीच बनी रहती हैं। मुझे डेटा संग्रहित करने में कोई त्रुटि नहीं दिखाई दे रही है, और अनुमतियां लिखना सही है। मैंने देखा है कि अस्थायी फ़ाइलें आती हैं और अन्य ऐप्स पर जाती हैं (सामान्य लगती है कि वे गायब हो जाते हैं)। मैं वर्षों से ऐसा कर रहा हूं और पहली बार मैंने कभी इस व्यवहार को देखा है, इसलिए यह मुझे वास्तव में मेरे सिर को खरोंच कर रहा है। सुझावों के लिए धन्यवाद, अनुमतियों की जांच करने के लिए सोचा नहीं था। – bsneed

1

विचार - क्या वह डेटा है जिसे आप ठीक से नामित फ़ाइल में लिखा जा रहा है? मुझे लगता है कि आपने बताया कि यह है। मैं सोच रहा हूं कि अगर सही नामित फ़ाइल एनएसडीफॉल्ट के अलावा किसी अन्य चीज़ द्वारा लिखने की अनुमति के साथ खुली है और यदि वह अस्थायी फ़ाइल प्रतिलिपि से सुरक्षित सहेजने वाली प्रतिलिपि को अवरुद्ध कर रहा है?

+0

सामान्य डीबगिंग रणनीति निश्चित रूप से लागू होती है; पूरे प्रोजेक्ट फ़ोल्डर की प्रतिलिपि बनाएँ और एक समय में सामान को फाड़कर सरलीकृत करना शुरू करें और देखें कि व्यवहार कब बंद हो जाता है। इसे काफी सरल बनाएं और आपको या तो अपनी बग मिल जाएगी, या ऐप्पल के बग रिपोर्टर के लिए एक अच्छा प्रदर्शन कार्यक्रम होगा: -/ – Dad

+0

डेटा इसे सही फ़ाइल में बना रहा है।मुझे नहीं लगता कि गिट के भीतर उस फाइल को स्पष्ट रूप से खोलने वाला कोई कोड है, लेकिन मैं इसे ढूंढता रहूंगा। – bsneed

+0

कोई भी मौका आपके ऐप सामान्य रन लूप नहीं चला रहा है? (केवल मोडल रन लूप या कुछ की तरह)। या हम्म, आश्चर्य कीजिए कि क्या आप वास्तव में कई धागे से चूक को अपडेट कर रहे हैं और आप किसी प्रकार की दौड़ की स्थिति देख रहे हैं जहां दूसरा ऐसा नहीं होता है क्योंकि पहला व्यक्ति होने के बीच में होता है (या कुछ) ... और अधिक लगता है हालांकि इस बिंदु पर एक ओएस बग की तरह ... – Dad

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