2010-12-30 13 views
7

NSUserDefaults neden benim uygulama için Kütüphane/Tercihler'de önemsiz plist dosyaları bıraktığını anladığımda sorun yaşıyorum. vbNSUserDefaults neden benim uygulama için Kütüphane/Tercihler'de geçici plist dosyaları bırakıyor?

Ben aşağıdaki dosyaları görüyorum ...

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

... plist.* dosyaları 0 bayt. Uygulamanın çalıştırıldığı her zaman, arkasında yeni bir tane bırakır gibi görünüyor. -[NSUserDefaults synchronize]'u hiç aramamaya karar verdim, ancak eğer ararsam, belirli bir çalışma için önemsiz dosyaların görünümünü hızlandırır. Bir hata ayıklayıcıda adım attığımda, senkronize etmek için aramayı adım adım ilerledikçe yeni bir dosya çıktı. Senkronize çağrıyı çıkarırsam, uygulama başladığında, uygulamanın diğer zamanlarında yeni bir önemsiz dosya görünür.

Ayrıca, iş parçacığı üzerinde bir kullanıcı varsayılan ayarlamam (muhtemelen değil, belki de bir olasılık) ayarlayıp kontrol etmediğini de kontrol ediyorum, doktorların iş parçacığı için güvenli olduğunu düşündüklerini düşündüm.

Herhangi bir yardım için teşekkür ederiz. Teşekkürler!

DÜZENLEME: Sadece bu bulundu

: "Neden?" Ben answerers fikirle kabul ederken CFPreferences creates multiple files

, bu açıklamıyor Bölüm.

+0

Oldukça çılgın; nedenini öğrenirsen haberim olsun! –

+0

Ben tam olarak aynı sorunu yaşadım, geçici plists aslında tamamen iPad doldurarak sona eriyor (birden fazla Gb temsil eden ~ ~ 4Mb dosyaları). Kesinlikle bir iOS hatası gibi görünüyor. – quentinadam

cevap

3

Bunun bir Apple hatası olduğuna ikna oldum, ancak bunu gösteren küçük bir örnek oluşturamadım. Apple'ın kendi uygulamalarının bunu yaptığını söyleyen bir sürü geribildirim aldım. Bir duvara çarptığım ve hareket etmeye devam etmem gerektiğinden, aşağıda gösterilen kötü bir hack yapmak zorunda kaldım.

@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

Ben tam olarak aynı sorunu yaşadım, geçici plists aslında tamamen iPad doldurarak sona eriyor (birden fazla Gb temsil eden biten ~ 4Mb dosyaları). Kesinlikle bir iOS hatası. – quentinadam

1

Bu plist dosyaları uygulama başlatmaları arasında kalıcı mı? Tercihleri ​​saklarken hatalarınız mı var? resmi muhasebeniz yazma izinleri etkin mi?

Özellik listeleri, ilk olarak geçici bir dosyaya yazıldığı ve yazma işlemi sırasında bir hata yoksa, geçici dosya orijinal dosya adına yeniden adlandırıldığı anlamına gelen atomik olarak yazılabilir. Normal şartlar altında, geçici dosyaları görmemelisiniz.

+0

Pist dosyaları başlatmalar arasında kalıyor. Veri depolarken herhangi bir hata görmüyorum ve yazma izinleri doğru. Geçici dosyaların gelip diğer uygulamalara gittiğini gördüm (ortadan kaybolmaları normal görünüyordu). Bunu yıllardır yapıyordum ve ilk defa bu davranışı görmüştüm, o yüzden kafamı kaşıdıyorum. Önerileriniz için teşekkürler, izinleri kontrol etmeyi düşünmemişti. – bsneed

1

Düşünce - sakladığınız veriler doğru adlandırılmış dosyaya yazılıyor mu? Sanırım bunun olduğunu ima ettin. Ben düzgün adlandırılmış dosya NSDefaults dışında bir şey tarafından yazma izinleri ile açık olup olmadığını ve eğer geçici kayıt temposu dosya aşamasından güvenli blok engelleniyor ise merak ediyorum?

+0

Genel hata ayıklama stratejisi elbette geçerlidir; Tüm proje klasörünü kopyalayın ve her seferinde bir şeyler yırtarak basitleştirmeye başlayın ve davranışın ne zaman durduğunu görün. Yeterince basit bir şekilde alın ve hatayı bulabilir veya Apple'ın hata muhabiri için güzel bir tanıtım programına sahip olursunuz: -/ – Dad

+0

Veriyi doğru dosyaya dönüştürüyor.Bu dosyayı Gity içinde açıkça açan herhangi bir kod olduğunu görmüyorum, ancak bunu aramaya devam edeceğim. – bsneed

+0

Uygulamanızın normal çalışma döngüsünü çalıştırma ihtimali yok mu? (sadece modal çalışma döngüsü gibi). Ya da hmm, birden çok iş parçacığının varsayılanlarını gerçekten sık sık güncelleştiriyorsanız ve ikinci türün gerçekleşmediği bir tür yarış durumu görüyorsanız merak ediyorum, çünkü birincisi, olayın ortasında (ya da bir şeyin) ... Daha fazlası Bu noktada bir os hata gibi ... – Dad