193 votes

La conversion implicite de l'objectif c perd la précision de l'entier 'NSUInteger' (alias 'unsigned long') à l'avertissement 'int'

Je travaille à travers quelques exercices et j'ai un avertissement qui dit:

La conversion implicite perd la précision entière 'NSUInteger' (alias 'unsigned long') en 'int'

Je suis tout à fait le noob et apprécierais toute aide .. merci.

 #import <Foundation/Foundation.h>

int main (int argc, const char * argv[])

{
    @autoreleasepool {


        NSArray *myColors;

        int i;
        int count;

        myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];

        count = myColors.count; //  <<< issue warning here

        for (i = 0; i < count; i++)

        NSLog (@"Element %i = %@", i, [myColors objectAtIndex: i]);

    }


return 0;

}
 

479voto

Martin R Points 105727

L' count méthode de NSArray renvoie un NSUInteger, et sur le 64-bit OS X plate-forme

  • NSUInteger est défini comme unsigned long, et
  • unsigned long est un 64 bits entier non signé.
  • int est un entier de 32 bits.

Donc, int est un "petit" type de données qu' NSUInteger, donc l'avertissement du compilateur.

Voir aussi NSUInteger dans la "Fondation des Types de Données de Référence":

Lors de la construction d'applications 32 bits, NSUInteger est un non signé de 32 bits entier. Une application 64 bits traite NSUInteger en 64 bits non signé entier.

Pour corriger cela d'avertissement du compilateur, vous pouvez déclarer le local count variable

NSUInteger count;

ou (si vous êtes sûr que votre tableau ne sera jamais contenir plus de 2^31-1éléments!), ajouter un cast explicite:

int count = (int)[myColors count];

24voto

Adrian Points 80

Contrairement à la réponse de Martin, lancer vers int (ou ignorer l'avertissement) n'est pas toujours sûr même si vous savez que votre tableau ne contient pas plus de 2 ^ 31-1 éléments. Pas lors de la compilation pour 64 bits.

Par exemple:

 NSArray *array = @[@"a", @"b", @"c"];

int i = (int) [array indexOfObject:@"d"];
// indexOfObject returned NSNotFound, which is NSIntegerMax, which is LONG_MAX in 64 bit.
// We cast this to int and got -1.
// But -1 != NSNotFound. Trouble ahead!

if (i == NSNotFound) {
    // thought we'd get here, but we don't
    NSLog(@"it's not here");
}
else {
    // this is what actually happens
    NSLog(@"it's here: %d", i);

    // **** crash horribly ****
    NSLog(@"the object is %@", array[i]);
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X