La differenza è che il primo pezzo di codice si registra valori di default che verrà utilizzato quando l'utente non ha fatto alcuna modifica la proprietà".
Quindi, se si desidera fornire diciamo una "proprietà" con il nome chiave "messaggio di benvenuto", è possibile che anziché restituire la proprietà nil, inserire un messaggio predefinito "Primo utente benvenuto" che verrà visualizzato quando non ci sono stati cambiamenti alla proprietà.
Ciò semplifica la logica perché non è necessario scrivere un test if
per verificare se la "proprietà" restituisce nil e quindi creare un altro messaggio se questo è il caso.
NSString *greeting = [[NSUserDefaults standardUserDefaults] stringForKey:@"Greeting"];
if(greeting == nil) {
NSLog(@"Welcome first-time user!");
}
Il secondo snippet di codice che hai postato è per l'impostazione della proprietà su un altro valore. Saranno disponibili diversi metodi set (setString, setObject, setBoolean) per impostare i valori in base allo stato del programma in Userdefaults.
MODIFICA ----- Aggiornamenti come richiesto nel commento.
Il primo metodo è per la registrazione dei valori ai valori predefiniti, come suggerisce il nome. La prima volta che si accede alla proprietà con un nome di chiave, il valore sarà nullo per gli oggetti, falso per i booleani o 0 per i numeri. Invece di fare molti test e così via, se i valori non sono impostati nel programma, e quindi fare un'azione "predefinita" come nell'esempio precedente, puoi spedire la tua applicazione con alcuni valori già predefiniti per queste chiavi.
Un luogo tipico in cui inserire registerDefaults si trova nel metodo initializer in appDelegate.
Poi da qualche parte nel vostro programma si consiglia di impostare i valori di questi campi, allora si utilizza il setObject, setString, setBoolean ... e per il recupero si utilizza stringForKey, objectForKey ...
Pensate a come questo
Il registerDefaults è il costruttore in cui è possibile fornire valori sensibili per l'oggetto, altrimenti si ottengono alcuni valori predefiniti che ho già scritto. Successivamente, se si desidera modificare gli attributi dell'oggetto NON si usa il "costruttore" ma i metodi set/get.
Hmmm Ancora non capisco.Quindi vuoi dire che posso impostare la proprietà di @ "qualcosa" su anObject usando uno dei frammenti di codice, ma solo il primo controllerà se ho già il valore scritto prima, è corretto? Se ho già qualcosa scritto prima, non scriverò di nuovo il valore, è corretto? –
Risposta aggiornata. – LuckyLuke
Grazie per la risposta aggiornata! Solo una piccola cosa .. Se metto registerDefault in AppDelegate, vuol dire che non sarà chiamato più di una volta? Ad esempio il mio frammento di codice, sarà impostato su @ "qualcosa" per anObject una volta, corretto? Anche se il codice viene eseguito in AppDelegate ogni volta che avvio l'app? –