Ab sofort (September 2014) würde ich die Verwendung empfehlen NSInteger/CGFloat
sofort bei der Interaktion mit iOS-APIs usw. wenn Sie Ihre App auch für arm64 erstellen. Dies liegt daran , dass Sie wahrscheinlich unerwartete Ergebnisse erhalten, wenn Sie verwenden , um die float
, long
und int
Typen.
BEISPIEL: FLOAT / DOUBLE vs CGFLOAT
Als Beispiel nehmen wir die UITableView-Delegatenmethode tableView:heightForRowAtIndexPath:
.
In einer 32-Bit-Anwendung funktioniert es einwandfrei, wenn es wie folgt geschrieben ist:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
float
ist ein 32-Bit-Wert und die 44, die Sie zurückgeben, ist ein 32-Bit-Wert. Wenn wir jedoch denselben Code in einer 64-Bit-arm64-Architektur kompilieren / ausführen, ist 44 ein 64-Bit-Wert. Die Rückgabe eines 64-Bit-Werts, wenn ein 32-Bit-Wert erwartet wird, führt zu einer unerwarteten Zeilenhöhe.
Sie können dieses Problem mithilfe des CGFloat
Typs lösen
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Dieser Typ repräsentiert ein 32-Bit float
in einer 32-Bit-Umgebung und ein 64-Bitdouble
in einer 64-Bit-Umgebung. Daher erhält die Methode bei Verwendung dieses Typs unabhängig von der Kompilierungs- / Laufzeitumgebung immer den erwarteten Typ.
Gleiches gilt für Methoden, die Ganzzahlen erwarten. Solche Methoden erwarten einen 32-Bit- int
Wert in einer 32-Bit-Umgebung und einen 64-Bit - Wert long
in einer 64-Bit-Umgebung. Sie können diesen Fall lösen, indem Sie den Typ verwenden NSInteger
, der als int
oder long
basierend auf der Kompilierungs- / Laufzeitumgebung dient.