la conversión implícita de objective c pierde la precisión de entero ‘NSUInteger’ (también conocido como ‘unsigned long’) a ‘int’ warning

Estoy trabajando en algunos ejercicios y tengo una advertencia que dice:

la conversión implícita pierde la precisión de enteros ‘NSUInteger’ (también conocido como ‘unsigned long’) a ‘int’

Soy bastante novato y agradecería cualquier ayuda … gracias.

#import  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; } 

Captura de pantalla

El método de count de NSArray devuelve un NSUInteger y en la plataforma OS X de 64 bits

  • NSUInteger se define como unsigned long y
  • unsigned long es un entero sin signo de 64 bits.
  • int es un entero de 32 bits.

Así que int es un tipo de datos “más pequeño” que NSUInteger , por lo tanto, la advertencia del comstackdor.

Consulte también NSUInteger en la “Referencia de tipos de datos de Foundation”:

Al comstackr aplicaciones de 32 bits, NSUInteger es un entero sin signo de 32 bits. Una aplicación de 64 bits trata a NSUInteger como un entero sin signo de 64 bits.

Para corregir esa advertencia del comstackdor, puede declarar la variable de count local como

 NSUInteger count; 

o (si está seguro de que su matriz nunca contendrá más de 2^31-1 elementos), agregue un molde explícito:

 int count = (int)[myColors count]; 

Contrariamente a la respuesta de Martin, el envío a int (o ignorar la advertencia) no siempre es seguro, incluso si usted sabe que su matriz no tiene más de 2 ^ 31-1 elementos. No cuando se comstack para 64 bits.

Por ejemplo:

 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]); } 

Cambiar clave en Proyecto> Configuración de comstackción ” typecheck calls to printf / scanf : NO

Explicación: [Cómo funciona]

Verifique las llamadas a printf y scanf, etc., para asegurarse de que los argumentos proporcionados tengan los tipos apropiados para la cadena de formato especificada, y que las conversiones especificadas en la cadena de formato tengan sentido.

Espero que funcione

Otra advertencia

la conversión implícita de objective c pierde la precisión de enteros ‘NSUInteger’ (también conocido como ‘unsigned long’) a ‘int

Cambiar la clave ” conversión implícita a 32Bits Type> Debug> * 64 architecture: No

[ precaución: puede anular cualquier otra advertencia de conversión de architecture de 64 Bits] .

Hacer el lanzamiento expicit al “int” resuelve el problema en mi caso. Tuve el mismo problema. Asi que:

 int count = (int)[myColors count]; 
    Intereting Posts