A partir de este momento (septiembre de 2014), recomendaría usarlo NSInteger/CGFloat
al interactuar con las API de iOS, etc., si también está creando su aplicación para arm64. Esto se debe a que es probable que obtenga resultados inesperados cuando use el float
, long
yint
tipos.
EJEMPLO: FLOTADOR / DOBLE vs CGFLOAT
Como ejemplo tomamos el método delegado UITableView tableView:heightForRowAtIndexPath:
.
En una aplicación de solo 32 bits, funcionará bien si se escribe así:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
float
es un valor de 32 bits y el 44 que está devolviendo es un valor de 32 bits. Sin embargo, si compilamos / ejecutamos este mismo código en una arquitectura arm64 de 64 bits, el 44 será un valor de 64 bits. Devolver un valor de 64 bits cuando se espera un valor de 32 bits dará una altura de fila inesperada.
Puede resolver este problema utilizando el CGFloat
tipo
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Este tipo representa un float
entorno de 32 bits en un entorno de 32 bits y uno de 64 bits.double
en un entorno de 64 bits. Por lo tanto, al usar este tipo, el método siempre recibirá el tipo esperado independientemente del entorno de compilación / tiempo de ejecución.
Lo mismo es cierto para los métodos que esperan enteros. Dichos métodos esperarán un int
valor de 32 bits en un entorno de 32 bits y un valor de 64 bits long
en un entorno de 64 bits. Puede resolver este caso utilizando el tipo NSInteger
que sirve como int
o long
basado en el entorno de compilación / tiempo de ejecución.