Самое простое объяснение состоит в том, что миграция каким-то образом убеждает 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];
В общем, плохая практика - инициализировать любой объект в параметре метода.Вы просите о неприятных утечках памяти, которые будет очень трудно отследить.Сообщение об утечке может отображаться не в коде, где вызывается метод, а в самом методе.