Pourquoi NSUserDefaults refuse-t-il de sauvegarder mon NSDictionary?
Je suis en utilisant KVC pour sérialiser un NSObject
et de tenter de le sauver à NSUserDefaults
qui est de me donner un Attempt to insert non-property value
quand j'essaie de garder mon NSDictionary
.
Qui suit sont les propriétés de l'objet en question, MyClass
:
@interface MyClass : NSObject
@property (copy,nonatomic) NSNumber* value1;
@property (copy,nonatomic) NSNumber* value2;
@property (copy,nonatomic) NSString* value3;
@property (copy,nonatomic) NSString* value4;
@property (copy,nonatomic) NSString* value5;
@property (copy,nonatomic) NSString* value6;
@property (copy,nonatomic) NSString* value7;
@property (copy,nonatomic) NSString* value8;
@end
Quand il est temps de sauver MyClass il se produit ici:
-(void)saveMyClass
{
NSArray* keys = [NSArray arrayWithObjects:
@"value1",
@"value2",
@"value3",
@"value4",
@"value5",
@"value6",
@"value7",
@"value8",
nil];
NSDictionary* dict = [self dictionaryWithValuesForKeys:keys];
for( id key in [dict allKeys] )
{
NSLog(@"%@ %@",[key class],[[dict objectForKey:key] class]);
}
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:dict forKey:[NSString stringWithString:kMyClassKey]];
[defaults synchronize];
}
qui produit la sortie suivante:
2012-02-23 19:35:27.518 MyApp[10230:40b] __NSCFConstantString __NSCFNumber
2012-02-23 19:35:27.519 MyApp[10230:40b] __NSCFConstantString __NSCFNumber
2012-02-23 19:35:27.519 MyApp[10230:40b] __NSCFConstantString __NSCFString
2012-02-23 19:35:27.519 MyApp[10230:40b] __NSCFConstantString __NSCFString
2012-02-23 19:35:27.520 MyApp[10230:40b] __NSCFConstantString __NSCFString
2012-02-23 19:35:27.520 MyApp[10230:40b] __NSCFConstantString __NSCFString
2012-02-23 19:35:27.520 MyApp[10230:40b] __NSCFConstantString __NSCFString
2012-02-23 19:35:27.520 MyApp[10230:40b] __NSCFConstantString NSNull
2012-02-23 18:38:48.489 MyApp[9709:40b] *** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '{
value1 = "http://www.google.com";
value2 = "MyClassData";
value3 = 8;
value4 = "<null>";
value5 = "http://www.google.com";
value6 = 1;
value7 = "http://www.google.com";
value8 = 4SY8KcTSGeKuKs7s;
}' of class '__NSCFDictionary'. Note that dictionaries and arrays in property lists must also contain only property values.`
Comme vous pouvez le voir, tous les objets dans le dict
sont bien les valeurs de la liste et l'ensemble de ses touches sont NSString*
. Ce quiz je suis en manque afin de l'exécuter? Ou devrais-je abandonner et utiliser writeToFile
ou similaires?
source d'informationauteur Thomson Comer
Vous devez vous connecter pour publier un commentaire.
Accessoires pour Kevin, qui a suggéré l'impression de les valeurs, bien sûr, dont l'un est de type
NSNull
qui n'est pas une propriété valeur de la liste. Merci!Les encombrants de solution à mon problème - itérer sur les touches du dictionnaire j'ai juste produit très pratique avec
dictionaryWithValuesForKeys
et de supprimer ceux de typeNSNull
. soupirJ'ai l'habitude d'archives et désarchiver les dictionnaires lors de l'enregistrement à l'utilisateur par défaut.
De cette façon, vous n'avez pas à vérifier manuellement pour
NSNull
valeurs.Il suffit d'ajouter les deux méthodes suivantes pour votre code. Potentiellement dans une catégorie.
Ensuite, vous pouvez archiver tout dictionnaire comme cela (en supposant que la méthode sont disponibles dans la classe):
et de les récupérer plus tard encore, comme ceci:
Dans mon cas, lorsque je récupère le dictionnaire de l'utilisateur par défaut il était de retour à zéro, alors j'ai pensé NSUserDefaults est pas disposé à enregistrer mon dictionnaire.
Cependant, il a été sauvé, mais j'ai été en utilisant la mauvaise méthode get pour récupérer à partir de paramètres prédéfinis par l'utilisateur;
Assurez-vous utilisé l'un ou l'autre;
ou;
avant de vérifier toute autre raison possible.