Core Data iphone调试指针

Posted

技术标签:

【中文标题】Core Data iphone调试指针【英文标题】:Core Data iphone debugging pointers 【发布时间】:2010-02-10 23:14:55 【问题描述】:

我有一个相当复杂的 iPhone 核心数据应用程序。在大多数情况下,它运行良好,但我遇到了一个在 Core Data 中表现出来的零星问题。

我正在从远程服务获取数据,该服务返回数据。我解析数据并修改各种托管对象。然后我保存托管对象上下文,我得到一个错误。在打印错误的过程中,我收到以下消息: *** -[UIImage 长度]:无法识别的选择器发送到实例 0x8cd7aa0

我可以将问题隔离到我的一个托管对象中的单个 setter。我在使用设置之前保存托管对象上下文,然后立即保存托管对象上下文。失败马上就发生了。

这一切都在主线程中完成。我有多个托管对象上下文,但只有一个持久存储。

感谢任何调试此类核心数据问题的指针。

【问题讨论】:

【参考方案1】:

这个特殊问题是由其中包含单词“get”的方法引起的,该方法对应于托管对象中的字段名称。反过来,它掩盖了与数据库相关的真正问题。

【讨论】:

【参考方案2】:

我遇到了同样的问题,所以我设计了一个解决方法。 继承NSManagedObject 并通过覆盖图像属性的访问器方法手动转换UIImage

在setter方法中,将UIImage对象转化为NSData的实例,然后设置托管对象的image属性。 在getter方法中,转换图片属性的数据,返回UIImage的实例。

让我们开始工作吧:

在数据模型中,当您单击属性“图像”时,删除 Value Transformer Name 的文本。它默认为 NSKeyedUnarchiveFromData,这是您现在想要的。

接下来,通过在数据模型中单击实体子类,单击新建文件。选择实体后,您应该会在 Cocoa Touch Classes 中看到一个名为“Managed Object Class”的新类。单击下一步,再次单击下一步,使文件的位置保持原样,然后在要子类化的所有实体旁边打勾。

在您的子类NSManagedObject 的实现文件中,通过包含以下两个来覆盖图像属性的访问器方法:

- (void)setImage:(UIImage *)image 
    [self willChangeValueForKey:@"image"];

    NSData *data = UIImagePNGRepresentation(image);
    [self setPrimitiveValue:data forKey:@"image"];
    [self didChangeValueForKey:@"image"];


- (UIImage *)image 
    [self willAccessValueForKey:@"image"];
    UIImage *image = [UIImage imageWithData:[self primitiveValueForKey:@"image"]];
    [self didAccessValueForKey:@"image"];
    return image;

然后,无论何时设置图像,使用:

object.image = [UIImage imageNamed:@"icon.png"];

而不是:

[object setValue:[UIImage imageNamed:@"icon.png"] forKey:@"image"];

每当你得到图像时,使用:

UIImage *myImage = object.image;

而不是:

UIImage *myImage = [object valueForKey:@"image"];

【讨论】:

以上是关于Core Data iphone调试指针的主要内容,如果未能解决你的问题,请参考以下文章

怎样用GDB调试core文件

是否可以在开发 iphone 上查看存储在 Core Data 中的数据?

gdbcore文件进到某行

在Linux上利用core dump和GDB调试

linux下调试core dump文件

为啥调试器不知道我的 Core Data 生成的托管对象类上的方法? (附代码)