NSUserDefaults'u Temizleme


Yanıtlar:


514

Uygulamanın kalıcı etki alanını şu şekilde kaldırabilirsiniz:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

Swift 3 ve sonrasında:

if let bundleID = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundleID)
}

Bu @samvermette'nin cevabına benzer, ancak biraz daha temiz IMO.


Bu harika çalıştı, teşekkürler! Daha sonra appDomain'i bırakmayı unutmayın.
IcyBlueRose

15
@IcyBlueRose - bundleIdentifier, init veya new ile başlamadığı için otomatik olarak yayınlanan bir nesnedir, bu nedenle aşırı serbest bırakırsınız.
Christopher Rogers

1
Bilmek güzel, teşekkürler! Ama appDomain dizesinden bahsediyordum. Bu da otomatik olarak yayınlandı mı?
IcyBlueRose

2
@IcyBlueRose bundleIdentifier tarafından döndürülen nesne, appDomain tarafından başvurulan nesne ile aynıdır.
Christopher Rogers

2
Bunu 10.8 üzerinde çalışmak için alamıyorum gibi görünüyor, birisi bunun çalıştığını doğrulayabilir misiniz? İşte ilgili bir SO sorusu: stackoverflow.com/questions/13595415/…
DaGaMs

102

Bu kod varsayılan olarak kayıt etki alanına sıfırlanır:

[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

Başka bir deyişle, o removeObjectForKeyuygulamada kaydettiğiniz her bir anahtar için.

Bu Apple Geliştirici Forumları iş parçacığında Ken Thomases için kredi .


4
Çok teşekkürler. Neden [NSUserDefaults resetStandardUserDefaults]bunu yapmıyorsunuz benim ötesimde.
jakeboxer

2
@jboxer Apple belgelerini incelemek için biraz zaman harcadım ve resetStandardUserDefaults temel olarak bellek içi arabelleği diske temizler ve siler. Bir dahaki sefere bir değer almaya çalıştığınızda, onu diskten alması gerekir. Core Data'nın NSManagedObjectContext'i de benzer "reset" terminolojisini kullanır.
Christopher Rogers

2
Hata! Demek istediğim, bellek içi arabelleği diske yazmadan siliyordu. Böylece diske senkronize etmeden önce yaptığınız değişiklikler kaybolacaktır.
Christopher Rogers

4
Christopher, sanırım işler değişse de geriye doğru var. resetStandardUserDefaults, iOS'ta şimdiye kadar gördüğüm en kafa karıştırıcı olarak adlandırılan çağrıdır. Apple Dokümanlar "Paylaşılan kullanıcı varsayılanları nesnesinde yapılan değişiklikleri senkronize eder ve bellekten serbest bırakır" der. bu yüzden gerçekten flushAndReleaseStandardUserDefaults olarak adlandırılmalıdır. Eski bir yorum hakkında yorum yapmak için zaman ayırıyorum çünkü bu çağrıya yakalandım ve başkalarının yakılmasını önlemek istiyorum (şimdi bir müşteriye 90 uygulamayı güncellemem gerektiğini söylemeliyim).
Andy Dent

97

- kullanmayı denedin removeObjectForKeymi?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];

Şerefe sbooth. Çok Takdir Edildi.
TonyNeallon

5
Mevcut tüm anahtarlar için nesneyi kaldırmanın herhangi bir yolu var mı?
samvermette

2
Ben bu işe yaramış gibi görünse de, neden defunctPreference bir tür sistem sabit tanımlanmış değil? Gelecekte bir gün çalışmayı bırakacağı için gergin olacağım.
David H

Sonra senkronize etmeniz mi gerekiyor?
Travis M.

30

İşte Swift'in cevabı:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)

8
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)one-liner
Grace Shao

3
Veya daha güvenli:if let domainName = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) }
Valentin Shergin

1
Grace'in oneliner'in Swift 4 versiyonu:UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Carsten Hagemann

28

Geliştirirken buna ihtiyacınız varsa, simülatörünüzü de sıfırlayabilir ve tümünü silebilirsiniz NSUserDefaults.

iOS Simülatörü -> İçeriği ve Ayarları Sıfırla ...

Simülatördeki tüm uygulamaları ve dosyaları da sileceğini unutmayın.


15
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}

7

Swift'te:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }

6

Not: Bu cevap Swift için de güncellendi.

Bir satırda kalmaya ne dersiniz?

Christopher Rogers'ın cevabı genişletiliyor - kabul edilen cevap.

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];

ve evet, bazen ihtiyacınız olabilir synchronize,

[[NSUserDefaults standardUserDefaults] synchronize];

Bunu yapmak için bir yöntem oluşturdum,

- (void) clearDefaults {
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

Swift ?

Hızlı ile daha da kolay.

extension UserDefaults {
    class func clean() {
        guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
        standard.removePersistentDomain(forName: aValidIdentifier)
        standard.synchronize()
    }
}

Ve kullanım :

UserDefaults.clean()

6

Kod temiz yaptıkları zaman uzantıları seviyorum:

extension NSUserDefaults {
    func clear() {
        guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
            return
        }

        self.removePersistentDomainForName(domainName)
    }
}

Hızlı 5

extension UserDefaults {
    func clear() {
        guard let domainName = Bundle.main.bundleIdentifier else {
            return
        }
        removePersistentDomain(forName: domainName)
        synchronize()
    }
}


2

Yukarıdaki tüm yanıtlar çok alakalı, ancak birisi hala silinmiş uygulama için kullanıcı hatalarını sıfırlayamazsa, simülatörünüzün içerik ayarlarını sıfırlayabilirsiniz ve işe yarayacaktır.resim açıklamasını buraya girin


2

Bu bir hata ya da ne olursa olsun ama removePersistentDomainForNametüm NSUserDefaultsdeğerleri temizlerken çalışmıyor .

Yani, daha iyi bir seçenek sıfırlamak PersistentDomainve aşağıdaki yolla yapabilmenizdir:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)

1

@ Folse'nin cevabına genişleyerek ... Daha doğru bir uygulamanın olacağına inanıyorum ...

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain];
    for (NSString *key in [defaultsDictionary allKeys]) {
      NSLog(@"removing user pref for %@", key);
      [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
    }

... NSUserDefault'un persistentDomainForName: yöntemini çağırıyor. Dokümanlar durumu olarak, "Belirtilen kalıcı etki alanındaki anahtarları ve değerleri içeren bir sözlük döndürür" yöntemi. DictionaryRepresentation çağrısı: bunun yerine, daha geniş bir kapsam için geçerli olduğu için muhtemelen diğer ayarları içerecek bir sözlük döndürür.

Sıfırlanacak değerlerden herhangi birini filtrelemeniz gerekiyorsa, tuşları tekrarlamak bunu yapmanın yoludur. Açıkçası, sadece dikkate almadan uygulama için tüm tercihleri ​​nuke istiyorsanız, o zaman yukarıda yayınlanan diğer yöntemlerden biri en verimli.



0

Bunu dene, benim için çalışıyor.

Tek satırlık kod

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.