Na dzień dzisiejszy (wrzesień 2014 r.) Zalecam używanie NSInteger/CGFloat
podczas interakcji z interfejsami API iOS itp., Jeśli budujesz również swoją aplikację dla arm64. Wynika to z faktu, że prawdopodobnie uzyskasz nieoczekiwane wyniki podczas korzystania z float
, long
iint
typy.
PRZYKŁAD: FLOAT / DOUBLE vs CGFLOAT
Jako przykład bierzemy metodę delegowania UITableView tableView:heightForRowAtIndexPath:
.
W aplikacji tylko 32-bitowej będzie działać poprawnie, jeśli zostanie napisany w następujący sposób:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
float
jest wartością 32-bitową, a zwracana wartość 44 jest wartością 32-bitową. Jeśli jednak skompilujemy / uruchomimy ten sam fragment kodu w 64-bitowej architekturze arm64, wartość 44 będzie wartością 64-bitową. Zwrócenie wartości 64-bitowej, gdy oczekiwana jest wartość 32-bitowa, da nieoczekiwaną wysokość wiersza.
Możesz rozwiązać ten problem, używając CGFloat
typu
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Ten typ reprezentuje 32-bit float
w środowisku 32-bitowym i 64-bit double
w środowisku 64-bitowym. Dlatego podczas korzystania z tego typu metoda zawsze otrzyma oczekiwany typ niezależnie od środowiska kompilacji / środowiska wykonawczego.
To samo dotyczy metod, które oczekują liczb całkowitych. Takie metody będą oczekiwać int
wartości 32-bitowej w środowisku 32-bitowym i 64-bitowej long
w środowisku 64-bitowym. Można rozwiązać ten przypadek za pomocą typ NSInteger
, który służy jako int
lub long
na podstawie kompilacji / Runtime environemnt.