На сьогодні (вересень 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;
}
float32-бітове значення, а 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заснований на оточенні компіляції / виконання.