web-dev-qa-db-fra.com

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

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

la conversion implicite perd la précision de l'entier 'NSUInteger' (ou '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;

}

Screenshot

179
monkeyboy

La méthode count de NSArray renvoie un NSUInteger, et sur la plate-forme OS X 64 bits

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

Donc, int est un type de données "plus petit" que NSUInteger, d'où l'avertissement du compilateur.

Voir aussi NSUInteger dans la "Référence des types de données Foundation":

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

Pour résoudre cet avertissement du compilateur, vous pouvez déclarer la variable locale count comme

_NSUInteger count;
_

ou (si vous êtes sûr que votre tableau ne contiendra jamais plus de _2^31-1_ éléments!), ajoutez une conversion explicite:

_int count = (int)[myColors count];
_
455
Martin R

Contrairement à la réponse de Martin, passer à 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 en 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]);
}
24
Adrian

Changer de clé dans Projet> Paramètre de construction "les appels de typecheck à printf/scanf: NO"

Explication: [Comment ça marche]

Vérifiez les appels à printf et scanf, etc., pour vous assurer que les arguments fournis ont des types appropriés à la chaîne de format spécifiée et que les conversions spécifiées dans la chaîne de format ont un sens.

J'espère que ça marche

Autre avertissement

La conversion implicite de l’objectif C perd la précision de l’entier 'NSUInteger' (ou 'unsigned long') en 'int

Clé de changement "conversion implicite en 32 bits Type> Débogage> * architecture 64: non"

[attention: Cela peut annuler un autre avertissement de conversion d'architecture 64 Bits] .

4
Darshit Shah

Faire la conversion explicite vers "int" résout le problème dans mon cas. J'ai eu le même problème. Alors:

int count = (int)[myColors count];
2
Vladimir Despotovic