Ответ
NSInteger — это псевдоним типа (typedef) для примитивного целочисленного типа (int на 32-битных и long на 64-битных архитектурах). Это скалярное значение, используемое для вычислений.
NSNumber — это класс-обёртка (boxing class), наследник от NSObject. Он инкапсулирует числовые скалярные типы (как NSInteger, так и Float, Double, BOOL и др.) в объект.
| Ключевые различия: | Критерий | NSInteger | NSNumber |
|---|---|---|---|
| Тип | Скалярный тип (примитив) | Объект (класс) | |
| Назначение | Арифметические операции, индексы, счётчики | Хранение числа в объектных коллекциях (NSArray, NSDictionary), передача в API, ожидающие id/AnyObject |
|
| Производительность | Высокая (работа в стеке) | Ниже (выделение в куче, управление памятью) | |
| Сравнение | Операторы (==, <) |
Методы (isEqualToNumber:) |
Пример использования:
// NSInteger — для вычислений
NSInteger a = 10;
NSInteger b = 20;
NSInteger sum = a + b;
// NSNumber — для хранения в коллекциях
NSNumber *numA = @(a); // Синтаксис литерала
NSNumber *numB = @(b);
NSArray *numbersArray = @[numA, numB]; // Массив объектов
// Извлечение значения обратно
NSInteger extractedValue = [numA integerValue];
В Swift: NSInteger соответствует Int, а NSNumber автоматически бриджится в числовые типы Swift, но может быть представлен как NSNumber для совместимости с Objective-C API.