2011-09-22 4 views
1

Lorsque j'exécute ce code, la sortie est d'environ 1084848 à la console. Je ne peux pas comprendre pourquoi une telle sortie étrange ... voici le code. Le spécificateur de format "% i" attend un nombre entier, pas un objet.Xcode donne une sortie étrange de NSArray

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    int someNumber = 3; 
    [array addObject:[NSNumber numberWithInt:someNumber]]; 
    NSLog(@"%i" , [array objectAtIndex:0]); 
    [pool drain]; 
    return 0; 
} 

Répondre

2

Voici le pseudo-code de votre programme:

// 
// Inside of your main function.... 
// 
// Set up the Autorelease pool and then create an array 
// 
// Declare an int 
// 
// Add the int to an array, while wrapping it in an NSNumber 
// 
// Log the value of the first object in the array, using the int formatter 
// 
// Clean up and return 
// 

Vous connectez le premier objet du tableau, mais NSArray ne peut pas tenir une primitive ce n'est pas enveloppé dans un objet Objective-C.

Pour mieux comprendre votre code, essayez de changer ces lignes de code:

int someNumber = 3; 
[array addObject:[NSNumber numberWithInt:someNumber]]; 

les développer un peu. Essayez ceci:

int someNumber = 3; 
NSNumber *aNumber = [NSNumber numberWithInt:someNumber]; 
[array addObject:aNumber]; 

Donc, vous avez correctement mise la int dans un NSNumber, mais vous n'êtes pas le déballer. Vous devez demander à votre NSNumber pour le int qu'il détient comme ceci:

[[array objectAtIndex:0] intValue]; 

Ou, pour faire l'enregistrement en une ligne:

NSLog(@"%i" , [[array objectAtIndex:0] intValue]); 

Les caractères « %i » est appelé « formatter » . Différents types de valeurs nécessitent différents formateurs. Lorsque vous utilisez un objet Objective-C, vous utilisez "%@". Pour un NSInteger ou int, vous utiliseriez %i. Pour un flottant, vous utiliseriez "%f". Le fait est que vous devez soit déplier ce nombre, soit utiliser le formateur Objective-C pour les chaînes.

Une note rapide sur cette valeur étrange que vous receviez plus tôt: C'est une adresse mémoire dans la RAM. C'est la chose la plus proche que vous obtiendrez en utilisant un formateur incorrect. Dans certains cas, l'utilisation du mauvais formateur provoquera un EXC_BAD_ACCESS. Vous étiez "chanceux" et obteniez une valeur étrange au lieu d'un programme mort. Je suggère d'en apprendre plus sur les chaînes et les formateurs avant de passer à autre chose. Cela rendra votre vie beaucoup plus facile.

3

Essayez NSLog(@"%i" , [[array objectAtIndex:0] intValue]);

XCode est probablement vous donner un avertissement sur cette ligne: quelque chose comme "Conversion précise type 'int', mais l'argument a le type 'id'".

+0

Droite? – Monkeyanator

+0

Et oui, cela a fonctionné, mais je suis un peu confus sur pourquoi ... – Monkeyanator

+0

@Monkeyanator objectAtIndex: 0 est un objet, un NSNumber. – ThomasW

0

Lorsque vous utilisez %i pour les valeurs entières alors vous devriez donner des arguments comme entier comme ci-dessous

NSLog(@"%i" , [[array objectAtIndex:0] intValue]); 

Mais quand vous voulez objet à afficher, vous devez utiliser %@ qui identifie l'objet en cas général comme ci-dessous:

Attendez ... mais l'objet objectAtIndex 0 de tableau est un entier, qui est une primitive, pas un objet.
NSLog(@"%@", array);