NSUserDefaults removeObjectForKey vs. setObject: nil


116

As duas linhas a seguir são equivalentes?

1 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"example key"]

2 [[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"example key"]

Respostas:


14

Swift 3.0

A resposta abaixo não é mais o caso quando testei isso. Quando definido para nilo resultado, NSCFData está sendo armazenado. Possivelmente uma referência de objeto NSNull, mas não tenho certeza.

Para remover completamente um valor para um uso de chave UserDefaults.standard.removeObject(forKey: "YourDefault")

Testei com o seguinte código:

UserDefaults.standard.set(["a", "b", "c"], forKey: "MyDefaults")
print("Test A: My saved defaults \(UserDefaults.standard.object(forKey: "MyDefaults"))")

UserDefaults.standard.set(nil, forKey: "MyDefaults")
print("Test B: My defaults set to nil \(UserDefaults.standard.object(forKey: "MyDefaults"))")

UserDefaults.standard.removeObject(forKey: "MyDefaults")
print("Test C: My defaults removed \(UserDefaults.standard.object(forKey: "MyDefaults"))")

96

Sim, as duas linhas de código são equivalentes, ambas resultarão em leitura nula

id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"example key"];

NSUserDefaultsretornará nulo se a chave não for encontrada. Eu recomendaria usar o em removeObjectForKeyvez de defini-lo como nulo.

aqui está como testar se definir o valor da chave como nulo removeu a entrada da chave NSUserDefaults standardUserDefaults.

NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] copy];
   for(NSString *key in keys) {
       NSLog(@"Key Name: %@", key);
}
[keys release];

ou simplesmente despeje o dicionário de chave / valor de NSUserDefaults standardUserDefaults

NSLog(@"All contents of NSUserDefaults: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

1

Swift 5.0 + iOS 11 e superior

Ambos os métodos removem o valor. Tentei isso em um playground:

import Foundation

let key = "Test"
let value = "test"
let defaults = UserDefaults.standard

func printUD() {
    print("UserDefaults after modification:\n")
    defaults.dictionaryRepresentation().forEach { print("\($0): \($1)\n") }
    print("-------------\n\n")
}

defaults.set(value, forKey: key); printUD()
defaults.set(nil, forKey: key); printUD()
defaults.set(value, forKey: key); printUD()
defaults.removeObject(forKey: key); printUD()

Antes de iOS 11 este irá resultar em serialização nilem Datae lançar um erro.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.