Сравните NSNumber с NSInteger - PullRequest
5 голосов
/ 24 марта 2011

Я провел некоторое время сегодня, гоняясь за двумя ошибками, и в итоге исправил их обоих, используя одно и то же решение.

Теперь, когда у меня есть решение, я надеялся получить некоторую ясность за ним.

Я сравниваю атрибут из базовых данных (целое число 16 / NSNumber) с целым числом (ABPropertyID & ABMultiValueIdentifier).

Ошибка была в этом сравнении и, как ни странно, показала себя только после того, как я убил приложение (из фонового трея), снова открыл его и запустил тот же процесс, который включал сравнение. В любом случае ...

Это то, что перестало работать после перезапуска:

if (myNumber.aProperty == [NSNUmber numberWithInt:anInteger]) { /* do stuff here */ }

И вот два решения, которые до сих пор работают отлично:

if ([myNumber.aProperty integerValue] == anInteger) {/* do stuff here */ }

if ([myNumber.aProperty isEqualToNumber:[NSNumber numberWithInt:anInteger]]) { /* do stuff here */ }

Мне они все выглядят одинаково. Я всегда либо конвертирую NSNumber в integerValue, либо конвертирую целое число в NSNumber.

Есть идеи?

Ответы [ 3 ]

11 голосов
/ 24 марта 2011

Не используйте == для сравнения NSNumber с. Большую часть времени вы будете сравнивать два разных объекта, поэтому сравнение не получится истинным. Если вы посмотрите на свое условие if, обратите внимание, что вы особенно сравниваете свою собственность с новым NSNumber объектом.

Так как NSInteger является оболочкой Какао для определенных типов значений, сравнение NSInteger s с == работает нормально.

Реализация isEqualToNumber:, вероятно, берет обернутые типы значений и сравнивает их тоже.

2 голосов
/ 24 марта 2011

Как вы сказали, оба решения работают ...

Я бы предпочел первое, так как оно выглядит более читабельным, ИМХО ... Оно также может быть более производительным, поскольку вы сравниваете целые числапосле преобразования NSNumber в int.

Во втором случае вы конвертируете int в объект, затем сравниваете два объекта ... Итак, это второй вызов метода, которого у вас нетв первом случае ...

Надеюсь, это поможет ...:)

1 голос
/ 10 февраля 2012

netWorkingButtonsIndexes - массив, который содержит объекты и LinkedIn - это число с типом данных int.

[[netWorkingButtonsIndexes objectAtIndex:buttonIndex] isEqual:[NSNumber numberWithInteger:LinkedIn]] 

Используя метод isEqual, мы можем сравнивать объекты с любым типом данных.

...