2009-02-13 71 views
270

我使用+[NSUserDefaults standardUserDefaults]來存儲應用程序設置。這由大約十幾個字符串值組成。是否可以永久刪除這些值而不是將其設置爲默認值?清除NSUserDefaults

+1

[**從NSUserDefaults的刪除所有鍵**](http://stackoverflow.com/questions/6797096/delete-all-keys-from-a-nsuserdefaults -dictionary-iphone) – Hemang 2013-08-30 13:33:25

回答

486

您可以刪除應用程序的持久域是這樣的:

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

在斯威夫特3和更高:

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

這是類似於@samvermette的答案,但有點清潔IMO。

94

您是否嘗試過使用 - removeObjectForKey

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

乾杯sbooth。非常感激。 – TonyNeallon 2009-02-13 10:16:06

+5

任何方式來刪除所有現有的鍵的對象? – samvermette 2010-06-10 03:30:21

+2

雖然我明白這似乎工作,爲什麼不是defunctPreference某種系統定義常量?我一定很緊張,將來有一天會停止工作。 – 2011-11-09 19:58:16

101

此代碼重置默認爲註冊域名:

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

換句話說,它removeObjectForKey您在該應用註冊過的每一個關鍵。

積分肯Thomases這個蘋果開發者論壇thread.

27

如果您在開發時需要它,您也可以重置您的模擬器,刪除所有NSUserDefaults

iPhone模擬器 - >重置內容和設置...

記住,這也將刪除模擬器所有的應用程序和文件。

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

擴大對@ folse的答案......我相信一個更正確的實施將...

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的persistentDomainForName:方法。正如文檔所述,方法「返回包含指定持久域中的鍵和值的字典」。調用dictionaryRepresentation:相反,將返回一個可能包含其他設置的字典,因爲它適用於更廣的範圍。

如果您需要過濾掉任何要重置的值,那麼通過遍歷鍵是實現它的方法。很顯然,如果你只是不加考慮地爲應用程序設置所有的前綴,那麼上面提到的其他方法之一是最有效的。

1

以上所有的答案都非常重要,但如果有人仍無法重置已刪除的應用程序的userdefaults,那麼你可以重新設置內容設置你模擬器,它會工作。enter image description here

29

這裏是斯威夫特了答案:

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

注:這個答案已經爲斯威夫特被更新了。

怎麼樣在一條線上?

擴展@Christopher Rogers答案 - 接受的答案。

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

是的,有時你可能需要synchronize它,

[[NSUserDefaults standardUserDefaults] synchronize]; 

我創建了這樣做的方法,

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

斯威夫特

隨着swift更容易。

extension UserDefaults { 
    class func clearDefaults() -> Bool { 
     guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false } 
     self.standard.removePersistentDomain(forName: aValidIdentifier) 
     self.standard.synchronize() 
     return true 
    } 
} 

和使用

if UserDefaults.clearDefaults() { 
    //Done! 
} else { 
    //Not. 
} 
2

這是一個錯誤或什麼,但removePersistentDomainForName,同時清除所有NSUserDefaults值是行不通的。

所以,更好的選擇是重置PersistentDomain,並且您可以通過以下方式做到:

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

在斯威夫特:

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

我愛擴展時,他們使代碼更清潔:

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

     self.removePersistentDomainForName(domainName) 
    } 
} 
0

試試這個,它適合我。

的代碼

單線

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