A partire da oggi (settembre 2014), consiglierei di utilizzare NSInteger/CGFloatquando 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, longe inttipi.
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 CGFloattipo
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Questo tipo rappresenta un 32 bit floatin un ambiente a 32 bit e un 64 bit doublein 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 intvalore a 32 bit in un ambiente a 32 bit e un 64 bit longin un ambiente a 64 bit. È possibile risolvere questo caso utilizzando il tipo NSIntegerche funge da into o in longbase all'ambiente di compilazione / runtime.