我相信问题可能在于 C 和 D 之间的必需关系。如果您将图表配置为:
- 每个 C 至少需要一个 D。
- C 的许多实例都指向同一个 D。
然后在某个时刻,C 可能会发现它所需的关系已被取消。如果它尝试访问 D,则会触发 EXC_BAD_ACCESS。 (如果每个E需要一个D,你可能会遇到同样的问题)
为了调试我建议,
- 将关系 C-->D 设置为可选,然后查看错误是否消失。
- 从 C-->D 开始,每次将级联更改为空 1,然后查看错误是否消失。
- 如果您有类,请检查实例是否不共享实体图之外的某些公共对象。例如,C 类和 D 类都引用同一图像,但该图像不是实体的一部分。如果外部引用没有正确保留,也可能导致类似的崩溃。
- 将您的保存移至删除每个 B 的调用之后。在删除之前记录每个 B 及其 C。这样您就可以准确地看到保存是否失败以及保存失败时图表处于什么状态。
Edit01:
好的,我看了你的代码,发现了问题。
问题是您将 A 的“b”关系设置为必需。当你删除 B 时,它会抛出此错误:
2010-02-24 16:14:02.064 CoreDataTestDeleteRule[20887:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=1580 UserInfo=0x3d0b450 "Operation could not be completed. (Cocoa error 1580.)"
2010-02-24 16:14:06.340 CoreDataTestDeleteRule[20887:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=1580 UserInfo=0x3d19980 "Operation could not be completed. (Cocoa error 1580.)", {
NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1580.)";
NSValidationErrorKey = b;
NSValidationErrorObject = <A: 0x3b2faf0> (entity: A; id: 0x3d05330 <x-coredata://6870AF7C-E28F-4B4E-80AB-09C648651179/A/p1> ; data: {
b = (
);
name = a;
(顺便说一句,数字核心数据错误代码的文本错误可以在CoreDataErrors.h
.)
这是有道理的,因为您要求 A 有一个 b,然后删除所有 b。只需将 A->>B 关系设置为可选即可防止错误并允许代码正常运行。
您的代码还存在一些其他问题。一些自动生成的类没有正确显示。例如,B.h 的接口如下所示:
#import <CoreData/CoreData.h>
@class A;
@interface B : NSManagedObject
{
}
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) A * a;
@property (nonatomic, retain) NSManagedObject * c;
@end
当它应该看起来像:
#import <CoreData/CoreData.h>
@class A;
@class C;
@interface B : NSManagedObject
{
}
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) A * a;
@property (nonatomic, retain) C * c;
@end
我不知道为什么他们没有正确生成。
我还建议不要使用短变量和类名。 Objective-c 具有全局名称空间,使用单字母符号会导致名称冲突。你永远不知道还有谁在匆忙。我建议使用旧的二战风格的拼音字母(现代的拼音字母也有碰撞的风险)并命名测试类:Adam、Baker、Charlie、David、Eddy 等。
看来我们都把注意力集中在了BC>D关系上,而忽略了看得更远的地方。这是军方“目标固定”的程序员调试版本。你陷入了对问题的一个概念之中,无法摆脱。