iOS5 CoreData Entity показывает неправильное значение NSNumber, работает на iOS4 - PullRequest
4 голосов
/ 03 декабря 2011

У меня есть сущность CoreData со свойством NSNumber (целое число 16 в модели). У меня есть следующий код:

NSLog(@"raw changeAmount=%d", changeAmount);

NSNumber *changeNumber = [NSNumber numberWithInt:changeAmount];

NSLog(@"number changeAmount=%d = %@", [changeNumber intValue], changeNumber);

record.changeAmount = changeNumber;

NSLog(@"new changeAmount=%d", [record.changeAmount intValue]);

changeAmount - это int со значением 123000, когда я запускаю тест. Когда я тестирую на iOS 4, все работает правильно и выводит 123000. Однако, если я запускаю этот же код на iOS 5, значение будет примерно равно -8072 или -25,536. Вот так:

raw changeAmount=123000
number changeAmount=123000 = 123000
new changeAmount=-8072

Что, черт возьми, произошло между iOS4 и iOS5, что вызывает это? Я все время неправильно устанавливал свои свойства NSNumber?

Кажется, это не проблема целочисленного размера, потому что я изменил модель, чтобы использовать целое число 32 (что должно было быть все время), и это все еще происходит. Таким образом, мы не получаем целочисленное переполнение или что-либо еще.

1 Ответ

5 голосов
/ 03 декабря 2011

Я только что запустил этот код в CodeRunner

size_t shortSize = sizeof(short);
size_t intSize   = sizeof(int);

short short123000 = 123000;
int   int123000   = 123000;

NSString *format = @"\nshortSize       => %d\n"
                   @"int Size          => %d\n"
                   @"short with 123000 => %d\n"
                   @"int with 123000   => %d";

NSLog(format, shortSize, intSize, short123000, int123000);

, что приводит к:

shortSize         => 2  
int Size          => 4  
short with 123000 => -8072  
int with 123000   => 123000

NB Размер в байтах и ​​8 биттаким образом, в байте 2 * 8 = 16 бит и 4 * 8 = 32 бит.

У меня были похожие проблемы с некоторыми приложениями, над которыми я работаю.Похоже, что CoreData стал более строгим в отношении принудительного применения его типов.Я был пойман на это, но мне следовало быть более бдительным в отношении того, что я делал, если бы Apple изменила свой API, чтобы он не вел себя так, как предполагалось, что люди будут жаловаться, но когда API меняется, чтобы делать то, что он делаетВо-первых, это просто неудачно и может привлечь людей.

Как видите, это простое целочисленное переполнение, поэтому, если вы знаете диапазон, в котором вы работаете, вы можете легко это исправить.

...