ASP.NET является определенно хорошей платформой для высокого, загружают сайты, но не спускают глаз с тех расширений "Ajax". Они симулируют делать частичные обратные передачи страницы, но у них есть вся загрузка полностраничной обратной передачи.
Имеющиеся ответы полезны; добавив к ним:
Да, NSUInteger
дает вдвое больший диапазон положительных целых чисел, чем NSInteger
, но я думаю, что еще одна важная причина для выбора между ними - просто различать случаи , где отрицательные значения просто не имеют смысла .
Пример: возвращаемое значение NSArray
метода count
является NSUInteger
, что имеет смысл, поскольку у нас не может быть массива с отрицательным числом элементов. Когда кодировщик знает, что он без знака, он / она имеет больше свободы для выполнения операций, которые могут быть ненадежными в случае со знаком, включая побитовые операции, такие как сдвиг. В этом сообщении блога больше говорится о подписанных и неподписанных.
Мое предположение о CGFloat
против NSFloat
(которого не существует): может быть так, что разработчикам элементов кода с именем NeXTStep просто не нужно было укажите слишком много значений с плавающей запятой вне временных интервалов. Поэтому они дали NSTimeInterval
, который является типом с плавающей запятой, но явно предназначен для использования с временными интервалами. И, честно говоря, иметь этот тип здорово, потому что вы знаете, что он всегда должен быть в секундах, без необходимости иметь дело со структурой. Когда вы перемещаетесь в мир графики (где живет Core Graphics), внезапно вокруг вас появляются плавающие объекты, парящие в воздухе (ха-ха). Поэтому имеет смысл ввести здесь CGFloat
. Этот абзац представляет собой сплошное «обоснованное предположение»
. просто чтобы прояснить , почему вы можете использовать NSInteger
и т. д. вместо примитивных типов : потому что таким образом легче писать переносимый код, который полностью использует преимущества машинной архитектуры. Например, CGFloat
использует 32 бита на одних машинах и 64 бита на других, в значительной степени в зависимости от того, насколько велик пробел в эффективности на этих машинах для таких размеров. В некоторых случаях нет реального ускорения для использования 32 бит против 64 бит, поэтому вы также можете использовать 64 бит. Если вы объявили вещи как CGFloat
, вы внезапно получите эту дополнительную точность «бесплатно» при повторной компиляции.
И, как указал iKenndac,
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
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
.