À partir d'aujourd'hui (septembre 2014), je recommanderais d'utiliser NSInteger/CGFloat
lors de l'interaction avec les API iOS, etc. si vous créez également votre application pour arm64. En effet , vous obtiendrez probablement des résultats inattendus lorsque vous utilisez les float
, long
et les int
types.
EXEMPLE: FLOAT / DOUBLE vs CGFLOAT
Comme exemple, nous prenons la méthode déléguée UITableView tableView:heightForRowAtIndexPath:
.
Dans une application 32 bits uniquement, cela fonctionnera correctement s'il est écrit comme ceci:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
float
est une valeur 32 bits et le 44 que vous renvoyez est une valeur 32 bits. Cependant, si nous compilons / exécutons ce même morceau de code dans une architecture arm64 64 bits, le 44 sera une valeur 64 bits. Le renvoi d'une valeur 64 bits lorsqu'une valeur 32 bits est attendue donnera une hauteur de ligne inattendue.
Vous pouvez résoudre ce problème en utilisant le CGFloat
type
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Ce type représente un 32 bits float
dans un environnement 32 bits et un 64 bits double
dans un environnement 64 bits. Par conséquent, lorsque vous utilisez ce type, la méthode reçoit toujours le type attendu, quel que soit l'environnement de compilation / d'exécution.
Il en va de même pour les méthodes qui attendent des entiers. Ces méthodes attendent une int
valeur 32 bits dans un environnement 32 bits et une valeur 64 bits long
dans un environnement 64 bits. Vous pouvez résoudre ce cas en utilisant le type NSInteger
qui sert de int
ou long
basé sur l'environnement de compilation / exécution.