Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 核心数据在我的一个实体上因EXC_BAD_访问而崩溃_Iphone_Core Data - Fatal编程技术网

Iphone 核心数据在我的一个实体上因EXC_BAD_访问而崩溃

Iphone 核心数据在我的一个实体上因EXC_BAD_访问而崩溃,iphone,core-data,Iphone,Core Data,希望有人能帮我调试这个问题,因为EXC_BAD_ACCESS是我收到的唯一错误。我也尝试过打开NSZombieEnabled,但我无法得到更多信息 这个问题。我有四个实体: A->B->C->D 其中箭头表示集合:“a”包含与“B”的多对多关系、“B”与“C”的多对多关系等,用于创建我使用的实体: id dto = [NSEntityDescription insertNewObjectForEntityForName:@"A" inManagedObjectContext:conte

希望有人能帮我调试这个问题,因为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_访问而崩溃。该问题似乎发生在访问对象时,因为程序在注释掉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.
堆栈
堆栈跟踪非常大(?),调试时加载“62826堆栈帧”。显示其中的一部分:

第#8-#41行重复到第#62500帧周围

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

id dto = [[NSEntityDescription insertNewObjectForEntityForName:@"A" 
    inManagedObjectContext:context] retain];
NSLog(@"DTO: %@", dto);
确保在处理完对象后将其释放,以避免内存泄漏。如果您将在dto超出范围时完成对该对象的处理(或者如果它将由另一个对象保留),则可以自动释放该对象,让管理员为您处理它:

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

因此,每当有那么多堆栈帧时,就意味着有某种无限递归在进行。我的猜测是,当创建一个D对象时,有一些代码会自动创建其他的东西,这反过来又会创建另一个D,并且有一个未终止的循环。我将首先检查任何键值观察员或NSManagedObject覆盖

请在启用NSZombie的情况下发布堆栈或错误消息on@coneybeare:我现在已经添加了部分堆栈。不知道我是否曾经让NSzombie能够工作。请让我知道,如果你需要其他信息,在哪里可以找到它。谢谢你的回答。不幸的是,如果我保留或不保留,这没有什么区别-相同的崩溃。啊!找到了解决办法!在我的D对象中,我有一个名为“description”的属性。对应于堆栈帧中对description的许多调用。我把它改名为“desc”,现在可以用了。如果我能找到一个包含所有保留字的列表就好了……严格来说,它不是保留字。但这是NSObject定义的方法:注意警告!尝试将核心数据属性命名为“description”时会出现警告。忽略Objective-C中的警告总是一个坏主意。奇怪的是,我做了同样的事情,并且幸运地找到了这个线程,但是我没有收到任何关于将实体属性命名为description的编译器警告。。谢谢你们,今天我收到了。也没有得到任何警告。我总是在编译之前粉碎我的警告!当然,要找到。。。我获得了EXC_BAD_访问权限,我能够调试到我在代码中设置描述的地方,但这与任何内存管理错误无关。我只是发现他的书堆和我的非常相似。这只虫子真让人讨厌!