2009-06-25 4 views
6

Je suis confus au sujet de NSUserDefaults sur l'iPhone. Je viens d'un arrière-plan C/ASM et les choses Objective-C ont été une expérience d'apprentissage.Existe-t-il une meilleure façon de mettre un tas de choses dans NSUserDefaults?

J'utilise actuellement NSUserDefaults pour stocker des chaînes (pour les noms dans une table highscore). Je veux commencer à implémenter une fonctionnalité de type "Enregistrer le jeu", donc si l'utilisateur reçoit un appel ou quitte le jeu pour un moment, il peut y revenir.

Pour récupérer le jeu, j'ai un couple de BOOL drapeaux, un couple de int pour stocker quelques variables nécessaires, mais je suis coincé à un tableau que je dois stocker. J'ai un tableau de 50 éléments unsigned char s. Je pourrais le déplacer à int s si cela rendrait les choses plus faciles, mais je ne le vois tout simplement pas.

Pour travailler avec NSUserDefaults je peux setBool (faire déjà), setFloat (encore une fois, en faisant déjà), setInteger et setObject.

Évidemment, je pourrais déclarer des clés pour chaque élément du tableau et les stocker une par une avec setInteger mais c'est vraiment kludgy. Quelle est la meilleure façon d'aborder cela? Au lieu d'un tableau de unsigned char s, j'essaie en quelque sorte d'utiliser un NSObject? Y at-il de bons tutoriels sur NSObject que je peux lire pour mieux le comprendre?

Répondre

5

Les listes de propriétés correspondraient-elles mieux à ce que vous essayez d'obtenir?

Vous pouvez créer un dictionnaire, stocker une valeur pour chaque paramètre ou une matrice, puis le vider dans la liste des propriétés. Vous pouvez facilement les relire ou mettre à jour les valeurs en fonction des clés.

http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists/...

+1

Oui, vous utilisez généralement NSUserDefaults pour les préférences (comme le choix d'unités impériales ou métriques) et stockez les données de votre application dans un fichier séparé à l'aide de listes de propriétés sérialisées, sqlite, Core Data, etc .. –

+0

prefs, mais les données doivent être stockées ailleurs, comme un plist dans "~/Library/Application Support/MyApp /" par exemple. –

+0

Sur l'iPhone, il existe évidemment différentes conventions pour stocker des données, car la structure est très différente. Consultez les guides de programmation iPhone appropriés pour plus de détails sur le stockage des fichiers pour votre application. –

2

Vous pouvez passer un NSArray ou un NSDictionary-NSUserDefaults avec setObject:forKey:. Cela fonctionne très bien. Évidemment, votre tableau de caractères non signés devrait devenir un NSArray de NSNumbers, ce qui implique une surcharge, mais c'est probablement votre option la plus facile.

1

Essayez d'utiliser un objet NSData, qui peut être stocké directement à NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:[NSData dataWithBytes:array length:len] 
              forKey:@"someArray"]; 
0

Whoa là, vous devriez vraiment regarder en utilisant des données de base (ou juste SqlLite) pour stocker l'état du jeu. NSUserDefaults est pour ce qui est dit - par défaut, les paramètres de configuration. Il n'est pas vraiment destiné à stocker de gros morceaux de données binaires.

0

Pour convertir un ensemble d'éléments 50 C de caractères non signés pour un NSArray que vous pouvez stocker dans un NSUserDefaults en utilisant:

NSMutableArray* a = [NSMutableArray new]; 
for (int i = 0; i < 50; ++i) { 
    [a addObject:[NSNumber numberWithInteger:yourArray[i]]]; 
} 
[[NSUserDefaults standardUserDefaults] setObject:a forKey:@"theArray"]; 
[a release]; 

pour le récupérer:

NSArray* a = [[NSUserDefaults standardUserDefaults] objectForKey:@"theArray"]; 
for (int i = 0; i < 50; ++i) { 
    yourArray[i] = [[a objectAtIndex:i] integerValue]; 
} 

Il n'y a certainement pas problème avec l'utilisation de NSUserDefaults pour stocker votre état de jeu, pas quand il est si petit. Si votre état de jeu était trop long, vous pourriez vouloir l'enregistrer en tant que fichier plist, mais NSUserDefaults ne manquera pas de gérer ce volume de données.

+0

Merci pour le code et la recommandation. Je vais essayer. – K2Digital

Questions connexes