2012-03-02 2 views
4

У нас есть модель в iOS с свойством id. Вот что мы сейчас используем (кстати, это iOS 5).NSNumber vs. NSInteger vs. int для свойства NSObject

@property (nonatomic, assign) int userID; 

Кажется, что все в порядке. Мне интересно, не приведет ли это к дальнейшим проблемам.

Пример: Я понимаю, что это означает, что само свойство ID не может быть сохранено в plist. Однако это свойство NSObject. Если мы будем хранить что-либо в файле/core data/nsuserdefaults/независимо от того, что это скорее всего весь объект, а не только это свойство.

Я предполагаю, что мой вопрос ... мы собираемся решить любые проблемы, сохранив это как int, а не NSNumber?

Во-вторых, какая разница в сохранении этого как NSInteger. Я понимаю, что это просто тип def для long или int, зависящий от архитектуры. Поскольку мы ориентируемся только на iPhone, имеет значение, что он просто установлен на int? Похоже, в этом случае не было бы никакой разницы.

+0

Это ссылки были бы полезны. [Http://iphonedevelopertips.com/cocoa/nsnumber-and-nsinteger.html](http://iphonedevelopertips.com/cocoa/nsnumber-and-nsinteger.html) [http : //stackoverflow.com/questions/6662730/nsnumber-vs-int] (http://stackoverflow.com/questions/6662730/nsnumber-vs-int) – Anish

ответ

-1

Вполне нормально использовать int как свойство в подклассе NSObject.

В зависимости от платформы, NSInteger может быть int или long, но кроме этого, это не имеет значения, если вы используете int или NSInteger и могут быть использованы как взаимозаменяемые до тех пор, пока значение не превышает предел int.

+0

Конечно, вы можете присвоить значение не-объекту (то есть скалярный тип). 'assign' - единственный атрибут, который имеет смысл для значений типа' int' (или 'NSInteger',' float', 'BOOL' и т. д.). Единственная причина, из-за которой удаление 'assign' работает, заключается в том, что атрибут' assign' является атрибутом по умолчанию, поэтому не указывать семантический атрибут setter так же, как указание 'assign'. – Caleb

6

Я думаю, мой вопрос ... мы собираемся вызвать проблемы с , сохранив это как int, а не NSNumber?

Это действительно зависит от того, что вы собираетесь делать с этим значением. Если вы хотите рассматривать его как объект (например, чтобы сохранить его в NSArray или NSDictionary), NSNumber может быть удобным. Если вы просто хотите отслеживать стоимость, и int работает на вас, тогда это нормально использовать int.

Во-вторых, какая разница в сохранении этого в качестве NSInteger . Я понимаю, что это просто тип def либо длинный, либо int в зависимости от архитектуры. Поскольку мы ориентируемся только на iPhone , это имеет значение, что он просто установлен в int?

Я бы пошел с NSInteger (и NSUInteger). Используя эти типы, ваш код будет автоматически использовать соответствующий размер для архитектуры, для которой вы компилируете. Вы можете ориентироваться только на iOS, но вы, вероятно, используете свой код на симуляторе iOS, который работает на MacOS X. Так что это две архитектуры прямо там - и вы не знаете, что может случиться с iOS в будущем.

0

Единственным ограничением, о котором я могу думать, является то, что int = 0 является допустимым значением или int, не имеющим значение (null), является важным прецедентом.

Поскольку int всегда инициализируются 0, у вас не будет ситуации, когда вы можете проверить на отсутствие этого свойства.

В вашем случае скажите, что вы хотите проверить, присутствует ли user_id или нет, тогда это невозможно с примитивным типом данных, таким как int, поскольку он всегда будет иметь значение.

В других сценариях 0 может быть допустимым значением (или даже в вашем сценарии - Стив Джобс пошутил, чтобы быть номером сотрудника 0 в Apple во многих ссылках поп-культуры). В этом случае int, инициализируемый с 0 каждый раз, может быть нежелательным побочным эффектом, с которым вам придется иметь дело.