На сьогодні (вересень 2014 року) я рекомендую використовувати NSInteger/CGFloat
під час взаємодії з API iOS тощо, якщо ви також будуєте додаток для arm64. Це тому , що ви, ймовірно , отримаєте несподівані результати при використанні float
, long
і int
типів.
ПРИКЛАД: FLOAT / DOUBLE vs 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
заснований на оточенні компіляції / виконання.