核心数据在我的一个实体上与EXC_BAD_ACCESS崩溃

时间:2010-02-08 14:22:45

标签: iphone core-data

希望有人可以帮助我调试此问题,因为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-object的方法时程序运行成功。

更新

控制台输出

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.

堆栈
堆栈跟踪非常大(?),在调试时加载“62826堆栈帧”。显示它的一部分: alt text http://i50.tinypic.com/2qrzxi1.png alt text http://i49.tinypic.com/iedoj5.png
线#8-#41重复到帧#62500周围。

2 个答案:

答案 0 :(得分:9)

因此,只要存在多个堆栈帧,就意味着存在某种无限递归。我的猜测是,在创建D对象时,有一些代码会自动创建其他东西,而这又会创建另一个D并且有一个未终止的循环。我首先检查任何Key Value Observers或NSManagedObject Overrides

答案 1 :(得分:0)

看起来您需要保留新对象。该方法的description表示返回的对象是自动释放的,这意味着您的对象可能在您有机会使用之前被释放。将代码更改为如下所示:

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

确保在完成后释放对象以避免内存泄漏。如果你在dto超出范围的时候完成对象(或者它将被另一个对象保留),你可以自动释放它让autorelease pool为你处理它:

id dto = [[[NSEntityDescription insertNewObjectForEntityForName:@"A" 
    inManagedObjectContext:context] retain] autorelease];