2009-08-25 19 views
1

J'ai un problème étrange avec des valeurs variables. Voici le code (il fait partie d'une méthode de classe):iphone nslog données corrompues

MyAppDelegate *pDelegate = [[UIApplication sharedApplication] delegate]; 
SomeDictionaryData *appData = [pDelegate.theData retain]; 
NSLog(@"my instance var: %@",cardIndex); // outputs "my instance var: 4" 
NSDictionary *currentCard = [[NSDictionary alloc] initWithDictionary:[appData.cards objectAtIndex:cardIndex]];; 
// the above line breaks the app 
[currentCard release]; 
[appData release]; 

J'utilise le débogueur avec le objc_exception_throw point d'arrêt. L'entrée reçue par objectAtIndex indique qu'il a la valeur = 13760640. L'attribut cards de appData est un NSArray et il n'a clairement pas plus de dix millions d'éléments, donc je reçois une erreur hors limites. J'ai essayé de lancer avec (int)cardIndex sans de meilleurs résultats. Chose étrange est un code similaire dans d'autres travaux de classe bien.

Il s'agit de données que je souhaite utiliser dans toute mon application. Par conséquent, une classe Model est initialisée dans AppDelegate sous la forme theData et est ensuite accessible par différents ViewControllers. Cette erreur apparaît après un accès réussi sur un autre ViewController (que l'on conserve/libère également).

Toute aide sera appréciée.

Répondre

0

Utilisez [cardIndex unsignedIntValue] pour la ligne objectAtIndex:.

Vous ne pouvez pas donner objectAtIndex: un pointeur car il attend un entier non signé.

Par exemple:

NSDictionary *currentCard = [[NSDictionary alloc] initWithDictionary:[appData.cards objectAtIndex:[cardIndex unsignedIntValue]]]; 

EDIT:

On dirait cardIndex est un int mais quelque part le long des lignes il est défini comme une instance NSNumber. Comme un hack, utilisez [(id)cardIndex unsignedIntValue]. Si cela fonctionne, cela signifie que vous utilisez le mauvais type pour cardIndex (il devrait être NSNumber, pas int).

+0

Merci mec! Bien que je reçois un avertissement «récepteur invalide de type int». – mga

+0

Essayé casting comme (NSUInteger) et toujours recevoir l'avertissement. Tout le reste fonctionne bien ... Je n'aime pas les avertissements. – mga

+0

Tout droit! Converti toutes les références nécessaires à NSNumber. Merci! – mga