object c conversão implícita perde a precisão inteira ‘NSUInteger’ (também conhecido como ‘unsigned long’) para aviso ‘int’

Estou trabalhando em alguns exercícios e recebo um aviso dizendo:

conversão implícita perde precisão inteira ‘NSUInteger’ (também conhecido como ‘long unsigned’) para ‘int’

Eu sou bem noob e gostaria de receber qualquer ajuda .. obrigado.

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

Screenshot

O método count do NSArray retorna um NSUInteger e na plataforma OS X de 64 bits

  • NSUInteger é definido como unsigned long e
  • unsigned long é um inteiro não assinado de 64 bits.
  • int é um inteiro de 32 bits.

Portanto, int é um tipo de dados “menor” do que o NSUInteger , portanto, o aviso do compilador.

Veja também NSUInteger no “Foundation Data Types Reference”:

Ao criar aplicativos de 32 bits, o NSUInteger é um inteiro não assinado de 32 bits. Um aplicativo de 64 bits trata o NSUInteger como um inteiro não assinado de 64 bits.

Para corrigir esse aviso do compilador, você pode declarar a variável de count local como

 NSUInteger count; 

ou (se você tiver certeza de que sua matriz nunca conterá mais de 2^31-1 elementos!), adicione uma conversão explícita:

 int count = (int)[myColors count]; 

Ao contrário da resposta de Martin, a conversão para int (ou ignorar o aviso) nem sempre é segura, mesmo que você saiba que sua matriz não possui mais de 2 ^ 31-1 elementos. Não ao compilar para 64 bits.

Por exemplo:

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

Alterar chave em Project> Build Setting ” typecheck chamadas para printf / scanf : NO

Explicação: [Como funciona]

Verifique as chamadas para printf e scanf, etc., para certificar-se de que os argumentos fornecidos tenham tipos apropriados à cadeia de formatações especificada e que as conversões especificadas na cadeia de formato façam sentido.

Espero que funcione

Outro aviso

Objectivo c Conversão implícita perde a precisão inteira ‘NSUInteger’ (também conhecido como ‘não assinado’) para ‘int

Alterar chave ” conversão implícita para 32Bits tipo> debugging> arquitetura * 64: não

[ caucanvas: Pode anular outro aviso de conversão de arquitetura 64 Bits] .

Fazendo o expicit casting para o “int” resolve o problema no meu caso. Eu tive o mesmo problema. Assim:

 int count = (int)[myColors count];