À partir d'aujourd'hui (septembre 2014), je recommanderais d'utiliser NSInteger/CGFloatlors 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, longet les inttypes.
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;
}
floatest 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 CGFloattype
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Ce type représente un 32 bits floatdans un environnement 32 bits et un 64 bits doubledans 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 intvaleur 32 bits dans un environnement 32 bits et une valeur 64 bits longdans un environnement 64 bits. Vous pouvez résoudre ce cas en utilisant le type NSIntegerqui sert de intou longbasé sur l'environnement de compilation / exécution.