A partire da oggi (settembre 2014), consiglierei di utilizzare NSInteger/CGFloat
quando interagisci con le API di iOS ecc. Se stai anche costruendo la tua app per arm64. Questo perché è probabile ottenere risultati imprevisti quando si utilizzano i float
, long
e int
tipi.
ESEMPIO: FLOAT / DOUBLE vs CGFLOAT
Ad esempio prendiamo il metodo delegato UITableView tableView:heightForRowAtIndexPath:
.
In un'applicazione solo a 32 bit funzionerà bene se è scritto in questo modo:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
float
è un valore a 32 bit e il 44 che stai restituendo è un valore a 32 bit. Tuttavia, se compiliamo / eseguiamo questo stesso pezzo di codice in un'architettura arm64 a 64 bit, il 44 sarà un valore a 64 bit. Restituire un valore a 64 bit quando è previsto un valore a 32 bit darà un'altezza di riga imprevista.
È possibile risolvere questo problema utilizzando il CGFloat
tipo
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Questo tipo rappresenta un 32 bit float
in un ambiente a 32 bit e un 64 bit double
in un ambiente a 64 bit. Pertanto, quando si utilizza questo tipo, il metodo riceverà sempre il tipo previsto indipendentemente dall'ambiente di compilazione / runtime.
Lo stesso vale per i metodi che prevedono numeri interi. Tali metodi prevedono un int
valore a 32 bit in un ambiente a 32 bit e un 64 bit long
in un ambiente a 64 bit. È possibile risolvere questo caso utilizzando il tipo NSInteger
che funge da int
o o in long
base all'ambiente di compilazione / runtime.