Сбой памяти, связанный с добавлением объектов в NSArrayController - PullRequest
0 голосов
/ 09 мая 2009

Я пишу простое приложение ObjC2.0 / Cocoa и получаю сбой. Не знаком с Cocoa или ObjC, не могу понять, почему ..

Код, вызывающий проблемы: TableListCon.m

Когда я перетаскиваю папку в NSTableView, она вызывает addDirectoryToList - который рекурсивно перебирает все файлы, содержащиеся в этом каталоге, вызывая addFileToList для каждого.

Когда я перетаскиваю один файл в табличное представление, он вызывает addFileToList напрямую. Это работает правильно, но в консоли отладчика показывает следующее сообщение:

tvnamergui(2612) malloc: *** error for object 0x144ab0: double free
*** set a breakpoint in malloc_error_break to debug

Или, если я перетаскиваю папку, таких сообщений нет, и она перетаскивается непосредственно в GDB со следующей обратной трассировкой:

(gdb) bt
#0  0x95cee688 in objc_msgSend ()
#1  0x921e2e4f in NSPopAutoreleasePool ()
#2  0x917b4b10 in NSCoreDragReceiveProc ()
#3  0x95f9e1b0 in DoDropMessage ()
#4  0x95f9dc11 in CoreDragMessageHandler ()
#5  0x960f0d21 in __CFMessagePortPerform ()
#6  0x961128e8 in CFRunLoopRunSpecific ()
#7  0x96112cd8 in CFRunLoopRunInMode ()
#8  0x924892c0 in RunCurrentEventLoopInMode ()
#9  0x92489012 in ReceiveNextEventCommon ()
#10 0x92488f4d in BlockUntilNextEventMatchingListInMode ()
#11 0x914e0d7d in _DPSNextEvent ()
#12 0x914e0630 in -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] ()
#13 0x914d966b in -[NSApplication run] ()
#14 0x914a68a4 in NSApplicationMain ()
#15 0x000022a0 in main (argc=1, argv=0xbffff74c) at /Users/dbr/Desktop/tvnamergui/main.m:13

Даже странно, если я сначала перетаскиваю один файл, я получаю ошибку double free, но затем я могу без проблем сбрасывать папки (и все работает отлично)

Он всегда умирает при запуске [ArrayCon addObject:cfile]; (комментирование этой строки останавливает сбой, но, очевидно, нарушает функциональность!)

Редактировать : Благодаря сморгановскому ответу (с использованием NSZombieEnabled) у меня появилось более полезное сообщение об ошибке:

*** -[CFArray release]: message sent to deallocated instance 0x155a70

1 Ответ

3 голосов
/ 09 мая 2009

Несмотря на то, что я не могу дать конкретный ответ для вашего случая, лучший способ отладить аварийные выпуски, подобные этой, - это включить NSZombieEnabled , чтобы вы могли легко увидеть, какой объект перевыпускается .

Edit: после просмотра вашего проекта, я считаю, что ваша проблема на самом деле в инициализаторе AppCon. Вы устанавливаете переменную-член "theFiles" для автоматически освобожденного массива, и пока вы используете сохраняющее (ну, копирование) свойство, вы не устанавливаете его с синтаксисом свойства (self.theFiles = ...), поэтому вы в обход автоматически сгенерированного сеттера, который бы правильно обрабатывал управление памятью. Когда что-то пытается обновить это свойство позже, оно попытается освободить старое значение, которое по ошибке не было сохранено. Скорее всего, это тот массив, который вы видите в журнале зомби.

Короче, поменяй

theFiles = [NSMutableArray arrayWithObjects:...];

до

self.theFiles = [NSMutableArray arrayWithObjects:...];

и всегда используйте self.foo (или явную форму [self setFoo:]) при присваивании своим свойствам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...