Миграция основных данных теряет значение NSNumber - PullRequest
0 голосов
/ 26 сентября 2010

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

Сначала я попытался установить числовое значение в управляемом объекте следующим образом:

[temp setNumUses:temp.numUses+1];

... ноэто вызвало 'EXC_BAD_ACCESS', поэтому я изменил его на:

int hold = ((int)[[temp valueForKey:@"numUses"] intValue]);
hold++;
[temp setNumUses:[[NSNumber alloc] initWithInt:hold]];

... но после миграции этот код утверждал, что hold был инициализирован как int со значением 0, когда перед запуском новогокод, его значение было явно 1 или более (ссылаясь на тестовый объект, который использовался только 1 раз).

Когда я не переношу базу данных базовых данных, NSNumber сохраняет свое значение в порядке во многих сохранениях контекста и завершениях приложения,

Чего мне не хватает?У меня есть обширный код, который изменяет значения измененных NSManagedObjects в базе данных, хранящейся в другом месте, но ни один из них не вмешивается в 'numUses'.

Мысли?

1 Ответ

0 голосов
/ 26 сентября 2010

Самое простое объяснение состоит в том, что миграция каким-то образом убеждает Core Data в том, что numUses - это новый атрибут со значением по умолчанию, равным нулю.Причина этого кроется в модели миграции, а не в предоставленном вами коде назначения.

Тем не менее, код в родительском коде предполагает, что вы не совсем понимаете NSNumber и пропустите использование NSNumber в другом месте, что может привести к вашей проблеме.

NSNumber - это только объектная оболочка вокруг числовых значений.Вы не можете выполнять операции с ним.Вот почему эта строка:

[temp setNumUses:temp.numUses+1];

... вызывает EXC_BAD_ACCESS.Как вы обнаружили, вы должны преобразовать NSNumber в int или NSDecimalNumber для выполнения математических операций над ним.

Эта строка:

[temp setNumUses:[[NSNumber alloc] initWithInt:hold]];

... приведет к утечке памяти.Вы инициализируете объект NSNumber, но никогда не освобождаете его.В этом случае (и в подавляющем большинстве всех случаев) вы должны использовать методы класса для создания NSNumbers, потому что они возвращают автоматически выпущенный объект, который не будет утекать.Итак:

[temp setNumUses:[NSNumber numberWithInt:hold];

В общем, плохая практика - инициализировать любой объект в параметре метода.Вы просите о неприятных утечках памяти, которые будет очень трудно отследить.Сообщение об утечке может отображаться не в коде, где вызывается метод, а в самом методе.

...