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
。
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调试指针的主要内容,如果未能解决你的问题,请参考以下文章