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 comounsigned 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];