2012-06-17 3 views
0

это код:
КВЦ - о типе данных

NSNumber *taskId = [[self.taskList objectAtIndex:indexPath.row] valueForKey:@"identity"];  
NSInteger *intTaskId = [[self.taskList objectAtIndex:indexPath.row] valueForKey:@"identity"]; 

self.taskList является NSArray, которая заполнена основных данных выборки запроса в viewDidLoad методе ViewController в.
taskId является: 1
intTaskId является: 269303816
В самом деле, значение, хранящееся в основных данных: 1

ниже мои вопросы:
1, я запутался, почему NSInteger неправильно?
2, Должен ли я заменить NSInteger на NSNumber, чтобы избежать других проблем?

ответ

3

NSNumber является объектом, в то время как NSInteger просто typedef для примитивного (без объекта) типа (например, int). NSInteger: не a подкласс NSNumber. Основные данные возвращают числа как экземпляры NSNumber. Вы получаете значение weird NSInteger, потому что оно указывает на объект типа NSNumber, но пытается распечатать его, как если бы это было просто целое число.

Чтобы избежать проблем, вам необходимо заменить NSInteger на NSNumber. Можно также использовать метод intValue на NSNumber вернуться NSInteger:

NSNumber *objTaskId = [[self.taskList objectAtIndex:indexPath.row] valueForKey:@"identity"]; 
NSInteger *intTaskId = [objTaskId intValue]; 

Вы должны будете сделать это, если вы хотите, чтобы сделать сравнения (больше, равно тоже меньше) или арифметика (вы можете 't добавьте NSNumber в другой NSNumber или NSNumber в примитивный тип, такой как int или float).

+0

не всегда int: #if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 typedef long NSInteger; typedef unsigned long NSUInteger; #else typedef int NSInteger; typedef unsigned int NSUInteger; #endif – cdelacroix

+0

(извините за плохое форматирование, код не отформатирован в комментариях, как в ответах) – cdelacroix

+0

большое спасибо вам обоим, теперь у меня есть идея о том, как использовать NSNumber и NSInteger. – rock

Смежные вопросы