NSNumber против Int - PullRequest
       15

NSNumber против Int

9 голосов
/ 12 июля 2011

Если целые числа не могут быть записаны в словарь, а затем в .plist, но NSNumbers может, лучше ли использовать NSNumbers во всем приложении, а не преобразовывать их при каждом сохранении или загрузке словаря из .plist?

Ответы [ 3 ]

8 голосов
/ 12 июля 2011

Как обобщение: просто придерживайтесь типов POD, пока вам не понадобится для использования представления на основе объектов, такого как NSNumber. Производительность намного лучше с POD, но в некоторых случаях вам понадобится NSNumber.

В некоторых случаях может иметь смысл использовать NSNumber вместо этого - обычно, когда вы часто используете a NSNumber часто - чтобы избежать создания дубликата NSNumber s. Такие вхождения являются практичными лишь в редких случаях за пределами сериализации и общих интерфейсов objc (привязок, преобразователей, словарей).


Обновление / Подробности: Среда выполнения ObjC в некоторых случаях на некоторых архитектурах и в некоторых версиях ОС заменяет тегированный указатель , представляющий NSNumber s определенного типа и домена , Хотя внутреннее представление изменилось с тех пор, как оно было написано несколько лет назад, хорошее введение в тему: http://objectivistc.tumblr.com/post/7872364181/tagged-pointers-and-fast-pathed-cfnumber-integers-in. Где это можно использовать, оно избавляет вас от медленных операций, таких как операции выделения, блокировки и подсчета ссылок. , Тем не менее, теговые указатели не способны представлять каждое число, и это приводит к накладным расходам, поэтому вы все равно должны отдавать предпочтение базовым встроенным функциям вместо NSNumber по умолчанию. Помеченные указатели - отличная оптимизация, где это применимо, но они далеко не конкурируют со встроенными, когда вам просто нужно число .

0 голосов
/ 12 июля 2011

Все зависит от ваших потребностей. Но если API требует, чтобы вы использовали int , вы должны использовать int . Если вам нужно использовать NSNumber , вы должны использовать NSNumber .

Например, если вы используете UISegmentedControl и хотите выбрать сегмент, то

[segmentedControl setSelectedSegmentIndex:aIntVar]; // Can not use NSNumber here
// or
[segmentedControl setSelectedSegmentIndex:[aNumber intValue]];
0 голосов
/ 12 июля 2011

NSNumber - это объект, унаследованный от объекта-оболочки NSValue.

int не является объектом.

если использовать NSNumber, вы можете получить все больше и больше функций для использования с ними.

http://developer. .com / библиотека / Mac / # документация / какао / Справка / Foundation / Классы / NSNumber_Class / Справка / reference.html

NSNumber - это класс, который помогает вам хранить числовые типы как объекты. У него есть методы для преобразования между различными типами и методы для получения строкового представления вашего числового значения. Если вы используете переменную day типа NSNumber *, как вы это делали в своем примере, вы изменяете не значение day, а его адрес памяти.

...