当核心数据的价值发生变化时如何“破解”?

时间:2012-11-15 18:47:09

标签: objective-c xcode4.5

我有这个bug,其中anImage.URL的值突然变为零。 anImage是Image类的对象。数组中有5个这样的值。不知何故,至少有一个人的网址会以某种方式变成零。

我不知道那件事发生了什么变化。

所以我把它设置为anImage.URL = something

的类别
-(void) setURL:(NSString *)URL
{

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

并在那里设置断点。

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

我该怎么办?

当值更改无法正常工作时,调试器会中断。毕竟它是一个阵列。无论如何我应该注意什么?

我不确定如何使用keyValueObserving。

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

2 个答案:

答案 0 :(得分:2)

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

可以在“核心数据编程指南”中的Custom Attribute and To-One Relationship Accessor Methods中找到一个示例。

您在托管对象子类“Image”上创建一个类别(例如“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"];
}

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

答案 1 :(得分:0)

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

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

我只想分享一下。我会尝试马丁的解决方案。