我有这个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完全像以前一样工作。唯一的区别是我想在那里设一个断点。
答案 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上下文。从技术上讲,你可以使用执行块,但这是一个不同的故事。
我只想分享一下。我会尝试马丁的解决方案。