objective-c compiler-warnings implicit-conversion

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



objective-c compiler-warnings (4)

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


Cambiar clave en Proyecto> Configuración de compilació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 objetivo 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 arquitectura de 64 Bits] .


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


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 compilador.

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

Al compilar 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 compilador, 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];


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

int count = (int)[myColors count];