NSNumber> = 13 не сохранит. Все остальное будет - PullRequest
4 голосов
/ 28 марта 2010

Код, над которым я сейчас работаю, требует добавления объекта NSNumber в массив. Все NSNumbers со значением 0-12 добавляются нормально, но 13 и далее вызывает EXC_BAD_ACCESS. Я включил NSZombieEnabled и теперь получаю *** -[CFNumber retain]: message sent to deallocated instance 0x3c78420.

Вот стек вызовов:
#0 0x01eac3a7 in ___forwarding___
#1 0x01e886c2 in __forwarding_prep_0___
#2 0x01e3f988 in CFRetain
#3 0x01e4b586 in _CFArrayReplaceValues
#4 0x0002a2f9 in -[NSCFArray insertObject:atIndex:]
#5 0x0002a274 in -[NSCFArray addObject:]
#6 0x00010a3b in -[Faves addObject:] at Faves.m:24
#7 0x000062ff in -[ShowController processFave] at ShowController.m:458
#8 0x002af405 in -[UIApplication sendAction:to:from:forEvent:]
#9 0x00312b4e in -[UIControl sendAction:to:forEvent:]
#10 0x00314d6f in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#11 0x00313abb in -[UIControl touchesEnded:withEvent:]
#12 0x002c8ddf in -[UIWindow _sendTouchesForEvent:]
#13 0x002b27c8 in -[UIApplication sendEvent:]
#14 0x002b9061 in _UIApplicationHandleEvent
#15 0x02566d59 in PurpleEventCallback
#16 0x01e83b80 in CFRunLoopRunSpecific
#17 0x01e82c48 in CFRunLoopRunInMode
#18 0x02565615 in GSEventRunModal
#19 0x025656da in GSEventRun
#20 0x002b9faf in UIApplicationMain
#21 0x00002498 in main at main.m:14

Если бы он не был изолирован от NSNumbers определенного диапазона, я бы предположил, что что-то напортачил с управлением памятью, но я просто понятия не имел.

Есть идеи?

Спасибо
Джош

Ответы [ 2 ]

11 голосов
/ 28 марта 2010

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

Как правило, числа до (и включая) 12 дают вам ссылку на уже существующий номер NSNumber, что возможно благодаря тому, что они неизменны. Расследование показало, что числа 13 или больше дали отдельный экземпляр.

Так что вы, вероятно, все-таки испортили управление памятью :-) В конце концов, просто то, что числа меньше 13, скорее всего, являются ссылками на уже существующие числа, что спасает ваш бекон в этих случаях. Я предлагаю вам опубликовать больше кода, чтобы мы могли отследить эту конкретную проблему.


А исходя из вашего комментария к другому ответу здесь:

Я добавил строку сохранения в код, и теперь все работает отлично. Понятия не имею почему. Я просто собираюсь катиться с этим. Спасибо!

Я думаю, вы обнаружите, что тот факт, что номера NSN меньше 13 уже имеют счет сохранения 1, прежде чем вы получите свой собственный (увеличение счетчика до 2), является причиной того, что они не вызывают EXC_BAD_ACCESS. Очевидно, ваш код теряет все номеров, которые вы выделяете, но система не освобождает тех, кому меньше 13, так как они все еще используются (сохраните счет 1 или более).

2 голосов
/ 28 марта 2010

Ясно, что NSNumbers> 12 сохранит. Я предлагаю вам написать очень маленькую программу, которая докажет это вам. Затем возьмите эту программу, сделайте ее функцией и вызовите ее в начале своей программы. Медленно перемещайте функцию к более поздним точкам в вашей программе, пока не появится ошибка. Таким образом, вы найдете свою настоящую ошибку.

...