Ошибка iOS 5 NSNumber - PullRequest
       2

Ошибка iOS 5 NSNumber

3 голосов
/ 16 ноября 2011

Я сойду с ума от этой ошибки!У меня есть этот кусок кода, который хорошо работает на iOS 4.3

newRegistered.ticket_id = [NSNumber numberWithInt:
[curRegistered objectForKey:@"ticket_id"] intValue]];

Если я делаю:

NSLog(@"ID before : %d, ID after : %d",
[curRegistered objectForKey:@"ticket_id"] intValue], [newRegistered.ticket_id intValue]);

У меня на iOS 4.3:

IDдо: 35459, ID после: 35459

И на iOS 5.0:

ID до: 35459, ID после: -30077

Пожалуйста помоги !Спасибо за продвижение.

## РЕДАКТИРОВАТЬ: ## Я немного больше исследовал проблему.Кажется, проблема заключается в назначении NSNumber в CoreData.Я должен был указать, что фрагмент кода выше используется с CoreData (newRegistered является NSManagedObject, а curRegistered является NSDictionary, содержащим данные JSON (только строки, никогда не int или long ...)).

Здеськонкретная проблема:

long long test = 789654;

Registereds *a = [NSEntityDescription insertNewObjectForEntityForName:@"Registereds" inManagedObjectContext:self.managedObjectContext];
a.ticket_id = [NSNumber numberWithLongLong:test];
NSLog(@"%lld -> %@", test, a.ticket_id); // Displays 789654 -> 3222 on iOS 5 and 789654 -> 789654 on iOS 4.3

NSNumber *ticket_id = [NSNumber numberWithLongLong:test];
NSLog(@"%lld -> %@", test, ticket_id); // Displays 789654 -> 789654

Таким образом, похоже, что проблема связана с объектом Registereds (который является NSManagedObject, как newRegistered в предыдущем примере).

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

1 Ответ

5 голосов
/ 17 ноября 2011

Подсказка: 789654, усеченный до 16 бит, равен 3222.

Я попытался воспроизвести вашу проблему с iOS 5. Единственный способ получить NSLog(@"%lld -> %@", test, a.ticket_id) для отображения '789654 -> 3222' -Я установил тип атрибута ticket_id на Integer 16.Если я установлю его на Integer 32 или Integer 64, отобразится ожидаемое значение.

Проверьте тип атрибута для ticket_id в редакторе модели данных.Поскольку вы используете long long, я предполагаю, что он должен быть установлен на Integer 64.Из того, что вы показываете, я подозреваю, что установлено значение Integer 16.Если нет, то значение усекается до 16 бит где-то еще.

...