Если целые числа не могут быть записаны в словарь, а затем в .plist, но NSNumbers может лучше использовать NSNumbers во всем приложении, вместо необходимости конвертировать все время в сохранение или загрузку словаря из .plist?
NSNumber vs Int
Ответ 1
В качестве обобщения: просто придерживайтесь типов POD, пока вам не понадобится использовать объектное представление, например NSNumber
. Производительность намного лучше с POD, но в некоторых случаях вам понадобится NSNumber
.
В некоторых случаях может возникнуть смысл использовать NSNumber
вместо этого - это обычно, когда вы повторно используете NSNumber
часто - это чтобы избежать создания тонны дубликатов NSNumber
s. Такие вхождения практичны только в редких случаях за пределами сериализации и общих интерфейсов objc (привязки, трансформаторы, словари).
Update/Details: время выполнения ObjC в некоторых случаях, на некоторых архитектурах и на некоторых версиях ОС заменяет тегированный указатель, представляющий NSNumber
определенного типа и домена. Хотя внутреннее представление изменилось с тех пор, как было написано несколько лет назад, вот хорошее введение в тему: http://objectivistc.tumblr.com/post/7872364181/tagged-pointers-and-fast-pathed-cfnumber-integers-in. Если это можно использовать, это избавит вас от медленных операций, таких как операции выделения, блокировки и ref count. Тем не менее тегированные указатели не могут представить каждое число, и оно вводит накладные расходы, поэтому вы по-прежнему должны поддерживать основные встроенные функции над NSNumber
по умолчанию. Tagged pointers - отличная оптимизация, где это применимо, но далеки от конкуренции со встроенными, когда вам просто нужно число.
Ответ 2
NSNumber - это объект, унаследованный от объекта оболочки NSValue.
int не является объектом.
если использование NSNumber u может получить все больше и больше функций для использования с ними.
NSNumber - это класс, который помогает вам хранить числовые типы в качестве объекта. У него есть методы для преобразования между различными типами и методами для получения строкового представления вашего числового значения. Если вы используете переменный день типа NSNumber *, как вы это делали в своем примере, вы не изменяете значение дня, а его адрес памяти.
Ответ 3
Все зависит от ваших потребностей. Но если API требует, чтобы вы использовали int, вы должны использовать int. Он просит вас использовать NSNumber, который вы должны использовать NSNumber.
Например, если вы используете UISegmentedControl и хотите выбрать сегмент, то
[segmentedControl setSelectedSegmentIndex:aIntVar]; // Can not use NSNumber here
// or
[segmentedControl setSelectedSegmentIndex:[aNumber intValue]];