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"]

ma11hew28
fonte

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"))")
Sean
fonte
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]);
Homem foguete
fonte
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.

Daniil Korotin
fonte