gpt4 book ai didi

iphone - 核心数据: -deleteObject: Crashes, 是删除规则造成的吗?

转载 作者:行者123 更新时间:2023-12-03 19:40:52 27 4
gpt4 key购买 nike

我有以下模型,如图所示。

alt text http://img521.imageshack.us/img521/9741/schermata20100224a12251.png

我的应用程序需要刷新 B 的每个实例,因此在每次 viewWillAppear 时,我需要删除模型中的所有 B。删除B后,与C的关系的级联删除规则将删除所有C,然后级联到所有D。A 和 E 是常数。

我对每个对象都有删除规则,如下所示:

A: b - Cascade
B: c - Cascade, a - Nullify
C: b - Nullify, d - Cascade
D: c - Nullify, e - Nullify
E: d - Cascade

A -(cascade)->> B -(cascade)-> C -(cascade)->> D -(nullify)-> E
A <-(nullify)- B <-(nullify)- C <-(nullify)- D <-(nullify) E

我在对所有 B、C、D 进行级联删除时遇到问题。我的 fetchRequest 对象返回 A 中 B 的每个实例,然后我从 ManagedObjectContext 中对每个 B 调用 -deleteObject: 。但是调用 [managementObjectContext save:&error] 时出现 EXC_BAD_ACCESS

有人可以告诉我我做错了什么吗?我在每个实体上的删除规则都遇到问题还是问题出在其他地方?处理三个对象 B、C、D 上的级联删除的最佳实践是什么?

已编辑:

这是引发错误时的堆栈跟踪:

  #0    0x01d843ae in ___forwarding___
#1 0x01d606c2 in __forwarding_prep_0___
#2 0x01c618b6 in -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:]
#3 0x0003263a in _nsnote_callback
#4 0x01d4f005 in _CFXNotificationPostNotification
#5 0x0002fef0 in -[NSNotificationCenter postNotificationName:object:userInfo:]
#6 0x01bc217d in -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:]
#7 0x01c21763 in -[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:]
#8 0x01ba65ea in -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:]
#9 0x01bdc728 in -[NSManagedObjectContext save:]

这是我尝试将 NSZombieEnabled 和 MallocStackLogging 设置为 YES 时控制台中的日志:

  2010-02-24 15:41:39.803 Foo[2591:207] deleting object: FUM5
2010-02-24 15:41:40.515 Foo[2591:207] *** -[viewController controllerWillChangeContent:]: message sent to deallocated instance 0x7e54510

编辑 2:添加源代码

我尝试通过创建一个具有图像中确切架构的新项目来重现这种情况。您可以download it from here 。还有一个自述文本。希望我提供了足够的信息。

最佳答案

我相信问题可能在于 C 和 D 之间的必要关系。如果您的图表配置如下:

  1. 每个 C 至少需要一个 D。
  2. C 的许多实例都指向同一个 D。

然后在某个时刻,C 可能会发现它所需的关系已被取消。如果它尝试访问 D,则会触发 EXC_BAD_ACCESS。 (如果每个 E 需要一个 D,您可能会遇到同样的问题)

我建议进行调试,

  • 将关系 C-->D 设置为可选,然后查看错误是否消失。
  • 从 C-->D 开始将级联更改为空 1,然后查看错误是否消失。
  • 如果您有类,请检查实例是否不共享实体图之外的某些公共(public)对象。例如,C 类和 D 类都引用同一图像,但该图像不是实体的一部分。如果外部引用没有正确保留,也可能导致类似的崩溃。
  • 将您的保存移至删除每个 B 的调用之后。在删除之前记录每个 B 及其 C。这样您就可以准确地看到保存是否失败以及保存失败时图表处于什么状态。

编辑01:

好的,我看了你的代码,发现了问题。

问题在于您将 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;

(顺便说一句,数字 Core Data 错误代码的文本错误可以在 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 具有全局 namespace ,使用单字母符号会导致名称冲突。你永远不知道还有谁在匆忙。我建议使用旧的二战风格的拼音字母(现代的拼音字母也有碰撞的风险)并命名测试类:Adam、Baker、Charlie、David、Eddy 等。

看来我们都把注意力集中在了B<->C<->>D关系上,而忽略了看得更远的地方。这是军方“目标固定”的程序员调试版。你陷入了对问题的一个概念之中,无法摆脱。

关于iphone - 核心数据: -deleteObject: Crashes, 是删除规则造成的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2325676/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com