На данный момент (сентябрь 2014 г.) я бы рекомендовал использовать NSInteger/CGFloat
при взаимодействии с iOS API и т. Д., Если вы также создаете свое приложение для arm64. Это потому , что вы, вероятно , получите неожиданные результаты при использовании float
, long
и int
типов.
ПРИМЕР: FLOAT / DOUBLE против CGFLOAT
В качестве примера мы берем метод делегата UITableView tableView:heightForRowAtIndexPath:
.
В 32-битном приложении оно будет работать нормально, если оно написано так:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
float
это 32-битное значение, а возвращаемое вами 44 - это 32-битное значение. Однако, если мы скомпилируем / запустим этот же кусок кода в 64-битной архитектуре arm64, 44 будет 64-битным значением. Возвращение 64-битного значения, когда ожидается 32-битное значение, даст неожиданную высоту строки.
Вы можете решить эту проблему, используя CGFloat
тип
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Этот тип представляет 32-разрядную float
в 32-разрядной среде и 64-разрядную double
в 64-разрядной среде. Поэтому при использовании этого типа метод всегда будет получать ожидаемый тип независимо от среды компиляции / среды выполнения.
То же самое верно для методов, которые ожидают целые числа. Такие методы ожидают 32-битное int
значение в 32-битной среде и 64-битное long
в 64-битной среде. Вы можете решить этот случай, используя тип, NSInteger
который служит как int
или long
основанный на environemnt времени компиляции / выполнения.