Основные данные аварийно завершаются с EXC_BAD_ACCESS на одном из моих объектов - PullRequest
4 голосов
/ 08 февраля 2010

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

Проблема. У меня есть четыре объекта:

A -> B -> C -> D

Где стрелка символизирует набор: «A» содержит отношение «ко-многим» к «B», «B» - отношение «ко-многим» к «C» и т. Д. Для создания объекта я использую:

id dto = [NSEntityDescription insertNewObjectForEntityForName:@"A" 
    inManagedObjectContext:context];
NSLog(@"DTO: %@", dto);

и это, кажется, работает для A, B и C. Однако, при использовании его на объекте D приложение аварийно завершает работу с EXC_BAD_ACCESS. Кажется, проблема возникает при доступе к объекту, так как программа успешно выполняется при комментировании NSLog и других методов, обращающихся к объекту dto.

Обновление:

Консольный вывод

GNU gdb 6.3.50-20050815 (Apple version gdb-1346) (Fri Sep 18 20:40:51 UTC 2009)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".sharedlibrary apply-load-rules all
Attaching to process 3100.
Program received signal:  “EXC_BAD_ACCESS”.
warning: Unable to restore previously selected frame.
No memory available to program now: unsafe to call malloc
warning: check_safe_call: could not restore current frame

Data Formatters temporarily unavailable, will re-try after a 'continue'. (Not safe to call dlopen at this time.)
warning: Unable to restore previously selected frame.

Stack
Трассировка стека очень велика (?), При отладке она загружает «62826 кадров стека». Показываю часть этого: alt text alt text
Строки # 8- # 41 повторяются вокруг кадра # 62500.

Ответы [ 2 ]

9 голосов
/ 08 февраля 2010

То есть, когда есть так много стековых фреймов, это означает, что происходит какая-то бесконечная рекурсия. Я предполагаю, что при создании объекта D есть некоторый код, который автоматически создает что-то еще, что, в свою очередь, создает еще один объект D, и существует цикл, который не завершен. Я бы начал с проверки любых наблюдателей значения ключа или NSManagedObject Overrides

0 голосов
/ 08 февраля 2010

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

id dto = [[NSEntityDescription insertNewObjectForEntityForName:@"A" 
    inManagedObjectContext:context] retain];
NSLog(@"DTO: %@", dto);

Обязательно отпустите свой объект, когда закончите с ним, чтобы избежать утечек памяти. Если вы закончите работу с объектом (или если он будет сохранен другим объектом) к тому моменту, когда dto выйдет из области видимости, вы можете автоматически освободить его, чтобы разрешить пулу с автоматическим выпуском позаботиться о вас :

id dto = [[[NSEntityDescription insertNewObjectForEntityForName:@"A" 
    inManagedObjectContext:context] retain] autorelease];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...