1

我有这个错误,其中 anImage.URL 的值突然变为 nil。anImage 是 Image 类的对象。数组中有 5 个这样的值。不知何故,其中至少有一个的 URL 以某种方式变成了 nil。

我不知道那东西在哪里改变。

所以我将其设置为 anImage.URL = something 的类别

-(void) setURL:(NSString *)URL
{

    [super setValue:URL forKey:NSStringFromSelector(@selector(URL))];
}

并在那里设置断点。

但是,它成为一个问题,因为它只是递归地调用自己。

我该怎么办?

当值更改不起作用时,调试器会中断。毕竟它是一个数组。无论如何我应该看什么?

我不确定如何使用 keyValueObserving。

基本上我想重新实现 -(void) setURL:(NSString *)URL 以完全像以前一样工作。唯一的区别是我想在那里放一个断点。

4

2 回答 2

3

您可以实现自定义设置方法来调试或设置断点。

可以在“核心数据编程指南”中的自定义属性和一对一关系访问器方法中找到一个示例。

您在托管对象子类“图像”上创建一个类别(例如“MyAccessors”)(如果您还没有)。在实现文件“Image+MyAccessors.m”中添加

@interface Image (PrimitiveAccessors)
- (void) setPrimitiveURL:(NSString *)newURL;
@end

@implementation Image (MyAccessors)

- (void)setURL:(NSString *)newURL
{
    [self willChangeValueForKey:@"URL"];
    [self setPrimitiveURL:newURL];
    [self didChangeValueForKey:@"URL"];
}

@end

“诀窍”是(我花了一些时间才弄清楚这一点),您必须在不同的类别中声明原始访问器,而不是在您实现自定义访问器方法的类别中。

或者,您可以像这样实现自定义访问器:

- (void)setURL:(NSString *)newURL
{
    [self willChangeValueForKey:@"URL"];
    [self setPrimitiveValue:newURL forKey:@"URL"];
    [self didChangeValueForKey:@"URL"];
}

在这种情况下,您不必声明原始访问器方法。

于 2012-11-15T21:58:32.680 回答
0

这不是问题的直接答案。问题是如何调试它。

好吧,我发现了这个错误。当 NSManagedObject 行为不正常时,请确保您检查您没有跨线程使用 managedObject 上下文。从技术上讲,您可以使用执行块,但这是另一回事。

我只是想分享这个。稍后我会尝试 Martin 的解决方案。

于 2012-11-16T08:43:54.790 回答