2010-01-19 7 views
1

J'ai le tableau défini ci-dessous.iPhone - Enregistrement d'un tableau contenant NSNulls avec NSUserDefaults

NSMutableArray *tempMPArray = [NSMutableArray arrayWithCapacity:16]; 
for (int i=0; i < chapters; i++) 
{ 

    [tempMPArray addObject:[NSNull null]]; 
} 

Chaque fois que je l'utilise comme l'un des objets d'un dictionnaire ci-dessous pour enregistrer les valeurs par défaut, il se bloque avec EXC_BAD_ACCESS. Si je remplace les objets de la matrice par un autre objet NSNumber etc., cela fonctionne correctement. Qu'est-ce que je fais de mal avec mon tableau que NSUserDefaults le rejette? La trace de la pile ou NSZombie ne donne aucune information supplémentaire.

+0

Vous avez besoin de plus de détails, comment définissez-vous myDict? – Jordan

+0

Merci, heere est mon dictionnaire def: NSDictionary * myDict = [dictionnaireDDDictionnaireWithObjectsAndKeys: tempDSArray, kSecKey, tempMPArray, kChapKey, nil]; \t \t [[NSUserDefaults standardUserDefaults] registerDefaults: monDict]; [[NSUserDefaults standardUserDefaults] synchronize]; – Roby

Répondre

0

Voici une meilleure solution!

Définition d'une statique après @implementation

NSString *const Null = @""; 

Puis

NSMutableArray *tempDSArray = [NSMutableArray arrayWithCapacity:16]; 
for (i=0; i < chapters; i++) 
{ 

    [tempDSArray addObject:Null]; 
} 

Tout le reste devrait fonctionner correctement!

+1

Jordan, merci d'avoir sauvé mon bacon. Mes pensées ont pris une ornière au lieu de penser hors de la boîte. – Roby

2

Bien que la solution puisse être une «solution de rechange», je ne pense pas qu'elle réponde à la question sous-jacente. En fournissant un dictionnaire avec des valeurs [NSNull null], il fournit à NSUserDefaults un dictionnaire valide. Pourquoi est-ce qu'il plante? Est-ce quelque chose qu'il fait "mal" ou est-ce un bug dans registerDefaults?

Il peut y avoir des circonstances où il est important de savoir si un utilisateur a entré une valeur (ie une chaîne valide) ou non une valeur (null) et la méthode de création d'une "chaîne valide mais vide" ne peut pas déterminer si la chaîne vide était parce que l'utilisateur a créé une chaîne sans caractères ou s'il n'a jamais créé de chaîne du tout. Vous pouvez vouloir une logique différente dans ces deux cas. Je suis dans le même bateau, j'ai une valeur NSUserDefault que je veux être [NSNull null] et tout ce que j'ai lu suggère la "bonne" façon de mettre une valeur nulle dans un dictionnaire est avec [NSNull null ] et mon dictionnaire crée bien. Mais registerDefaults avec ce dictionnaire valide provoque un plantage. Cela suggère un bug dans l'implémentation de registerDefaults n'est-ce pas? Quel est le problème avec ce qui suit et pourquoi il plante?

NSArray *defaultValues = [NSArray arrayWithObjects:[NSNull null], nil]; 
NSArray *CurrentKeys = [NSArray arrayWithObjects: @"NullKey", nil]; 
NSDictionary *resourceDict = [NSDictionary dictionaryWithObjects:defaultValues forKeys:CurrentKeys]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:resourceDict]; 

En fin de compte, je pense que la réponse est que les userDefaults sont écrits comme un plist et plists ne prennent pas en charge NSNull. Si tel est le cas, la documentation de registerDefaults doit indiquer que seuls les types d'objets plist sont autorisés dans le dictionnaire.

Questions connexes