Какао. Зачем использовать NSInteger и CGFloat вместо int и float или, всегда, NSNumber? - PullRequest
3 голосов
/ 09 ноября 2011

Когда вам приходится иметь дело с числами для чего-то еще, кроме коротких вычислений, это потеря времени и энергии при использовании всегда NSNumber?

Какой лучший подход?

Ответы [ 4 ]

4 голосов
/ 09 ноября 2011

Когда вам приходится иметь дело с числами для чего-то еще, кроме коротких вычислений, это потеря времени и энергии при использовании всегда NSNumber?

Ну, NSNumber обычно приходится уходитьчерез создание обручей для подсчета и подсчета ссылок, так что это занимает намного больше времени, чем создание поплавка в стеке.

Кроме того, NSNumber является неизменным типом, поэтому он не делает многоимеет смысл устанавливать его часто, потому что каждый раз, когда он меняется, вы должны выделить новый экземпляр.Они делают несколько оптимизаций, но это все еще огромные накладные расходы по сравнению с созданием поплавка в стеке.Использование встроенных функций также потребует меньше памяти, чем NSNumber чаще, чем наоборот.

Какой лучший подход?

Я просто использую встроенные функции (например, float, int), если мне не нужен NSNumber. Подробности и обоснование здесь .

1 голос
/ 09 ноября 2011

NSInteger, NSUInteger, CGFloat и т. Д. Являются простыми типами и соответствуют int, unsigned int и float. NSNumber является классом Objective C, подкласс NSValue, чтобы быть определенным. Вы можете создать NSNumber объект из знака или без знака char, short int, int, long int, long long int, float, double или BOOL.
Одним из основных отличий является то, что вы можете использовать NSNumber в коллекциях, таких как NSArray, где требуется объект. NSInteger - это просто целое число, NSNumber - это объект.
По соображениям производительности, если можете, используйте примитивные типы (например, int, float). Однако иногда вы не можете избежать NSNumber,

1 голос
/ 09 ноября 2011

Используйте в зависимости от вашей задачи .

Например, если вы вычисляете ректы для рисования, используйте CGFloat, потому что это то, что используют ректы.

NSNumber, с другой стороны, действительно хорош для ситуаций, когда вам нужно несколько представлений числа (т. Е. Вам нужно использовать его как float и int).

0 голосов
/ 29 июня 2015

Использование NSInteger & CGFloat позволяет вашему коду правильно работать на всех 32- и 64-битных архитектурах. Если вы использовали int / float и скомпилировали свой код для 64-битной архитектуры, он, вероятно, не будет работать правильно в 32-битной системе. Кроме того, если Apple когда-либо выпустит 128-битную систему, ваш код NSInteger / CGFloat будет по-прежнему работать там (при условии, что Apple обновила определения NSInteger & CGFloat, что они, вероятно, будут).

Да, это значительная потеря времени, всегда использующая NSNumber

...