Каково различие между NSNumber и NSInteger?

ASP.NET является определенно хорошей платформой для высокого, загружают сайты, но не спускают глаз с тех расширений "Ajax". Они симулируют делать частичные обратные передачи страницы, но у них есть вся загрузка полностраничной обратной передачи.

61
задан mk12 13 April 2016 в 06:31
поделиться

3 ответа

Имеющиеся ответы полезны; добавив к ним:

Да, NSUInteger дает вдвое больший диапазон положительных целых чисел, чем NSInteger , но я думаю, что еще одна важная причина для выбора между ними - просто различать случаи , где отрицательные значения просто не имеют смысла .

Пример: возвращаемое значение NSArray метода count является NSUInteger , что имеет смысл, поскольку у нас не может быть массива с отрицательным числом элементов. Когда кодировщик знает, что он без знака, он / она имеет больше свободы для выполнения операций, которые могут быть ненадежными в случае со знаком, включая побитовые операции, такие как сдвиг. В этом сообщении блога больше говорится о подписанных и неподписанных.

Мое предположение о CGFloat против NSFloat (которого не существует): может быть так, что разработчикам элементов кода с именем NeXTStep просто не нужно было укажите слишком много значений с плавающей запятой вне временных интервалов. Поэтому они дали NSTimeInterval , который является типом с плавающей запятой, но явно предназначен для использования с временными интервалами. И, честно говоря, иметь этот тип здорово, потому что вы знаете, что он всегда должен быть в секундах, без необходимости иметь дело со структурой. Когда вы перемещаетесь в мир графики (где живет Core Graphics), внезапно вокруг вас появляются плавающие объекты, парящие в воздухе (ха-ха). Поэтому имеет смысл ввести здесь CGFloat . Этот абзац представляет собой сплошное «обоснованное предположение»

. просто чтобы прояснить , почему вы можете использовать NSInteger и т. д. вместо примитивных типов : потому что таким образом легче писать переносимый код, который полностью использует преимущества машинной архитектуры. Например, CGFloat использует 32 бита на одних машинах и 64 бита на других, в значительной степени в зависимости от того, насколько велик пробел в эффективности на этих машинах для таких размеров. В некоторых случаях нет реального ускорения для использования 32 бит против 64 бит, поэтому вы также можете использовать 64 бит. Если вы объявили вещи как CGFloat , вы внезапно получите эту дополнительную точность «бесплатно» при повторной компиляции.

И, как указал iKenndac,

52
ответ дан 24 November 2019 в 17:14
поделиться

NSNumber - это класс, а не примитив, и используется, когда вам нужно поместить необработанные числа в словари, массивы или инкапсулировать их иным образом. NSInteger , NSUInteger , CGFloat и т. Д. Являются простыми типами и соответствуют (в 32-битных системах, таких как iPhone) int , unsigned int и float .

Как правило, если вам нужно где-то сохранить число, используйте NSNumber . Если вы выполняете вычисления, циклы и т.п., используйте NSInteger , NSUInteger или CGFloat .

Вы можете заключить NSInteger в NSNumber :

NSNumber *aNumber = [NSNumber numberWithInteger:21];

... и вернуть его:

NSInteger anInteger = [aNumber integerValue];

Более подробную информацию можно найти здесь: http : // iosdevelopertips. com / cocoa / nsnumber-and-nsinteger.html

59
ответ дан 24 November 2019 в 17:14
поделиться

NSInteger похож на традиционный int в C. Это typedef. Есть и другие, такие как NSUInteger , CGFloat и т. Д., Которые являются синонимами примитивных типов.

NSNumber полезен, когда вам нужно вставить число в NSArray или NSDictionary. Стандартная практика - использовать эти коллекции вместо создания собственных; недостатком является то, что они могут содержать только объекты Objective-C.

NSNumber по существу оборачивает int (или float и т. д.) в объект Obj-C (аналогично концепции C # / Java «бокс» примитивный тип), который можно добавить в массив:

NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok

По соображениям производительности, если вы можете, используйте примитивные типы (например, int, float, int []). Однако иногда вы не можете избежать NSArray / NSNumber, например, когда вы читаете или записываете записи в файл .plist .

6
ответ дан 24 November 2019 в 17:14
поделиться