La conversión implícita del objective c pierde la precisión del integer 'NSUInteger'

Siguiendo un tutorial en treehouse, veo este popular post de advertencia de Object-C en XCode.

Mi function de button

- (IBAction)buttonPressed:(UIButton *)sender { NSUInteger index = arc4random_uniform(pnetworkingictionArray.count); self.pnetworkingictionLabel.text = [pnetworkingictionArray objectAtIndex:index]; } 

Lo veo en la línea NSUInteger, tengo algunos pocos flujos de superposition similares y parecen hablar de numbers de 32 bits vs 64 bits y types de conversión, pero no estoy seguro de cómo hacerlo aquí.

Mi pnetworkingicciónArray

 - (void)viewDidLoad { [super viewDidLoad]; pnetworkingictionArray = [[NSArray alloc] initWithObjects: @"It is certain", @"It is decidely so", @"All signs say YES", @"The stars are not aligned", @"My reply is no", @"It is doubtful", @"Better not tell you now", @"Concentrate and ask again", @"Unable to answer now", nil]; // Do any additional setup after loading the view, typically from a nib. } 

introduzca la descripción de la imagen aquí

Puede suprimir con security la advertencia con un yeso.

 NSUInteger index = arc4random_uniform((uint32_t) pnetworkingictionArray.count); 

No siempre es seguro suprimir las advertencias, así que no vayas lanzando cosas para deshacerte de las advertencias hasta que descifres si la operación es segura.

Lo que está sucediendo aquí es que NSUInteger es, en su plataforma, un typedef para un tipo integer de 64 bits. No siempre es 64 bits, solo en algunas plataforms. El comstackdor te advierte que algunos de esos bits se están desechando. Si sabe que estos bits no son importantes, puede usar un yeso.

En este caso, el resultado es que el index siempre estará por debajo de 2 32 -1. Si incluso es remotamente posible para pnetworkingictionArray contener 2 32 o más elementos, entonces su progtwig tiene un error y tendrá que build una versión de 64 bits de arc4random_uniform() . Puedes asegurarte esto con el siguiente código:

 assert(pnetworkingictionArray.count <= (uint32_t) -1); 

Según mi comentario, arc4random_uniform() y devuelve un u_int32_t , un integer sin signo que siempre es de 32 bits, independientemente de la architecture de destino. Sin embargo, pnetworkingictionArray.count devuelve un NSUInteger , que se NSUInteger forma diferente para sistemas de 32 y 64 bits; es de 32 bits ( unsigned int ) en un sistema de 32 bits y de 64 bits ( unsigned long ) en un sistema de 64 bits. Si se está ejecutando en un sistema de 64 bits, pasar un NSUInteger 64 bits a una function que espera un integer de 32 bits hará que el comstackdor se queje de que está tirando bits.