我正处于一个具有核心数据的应用程序项目的中间,我严格使用KVC仅针对NSManagedObjects
。因此,这样做的目的只是为了了解优点和缺点。我可能发现了一个缺点。然而,我无法解释为什么。
当我使用一些非常成熟的原则(在其他应用程序中已经使用过)将用户用手指绘制的图(文档的签名)保存在核心数据中并分别获取和显示或打印为PDF时,我遇到了这个问题。
事实证明,我能够从视图中获得UIImage
,将其存储在核心数据中,并立即使用KVC再次从核心数据中接收它(之间没有保存/获取),并将其显示在另一个视图中用于测试目的。但我无法真正保存它,从持久存储中获取数据并在屏幕上重新显示它。所以我做了很多调试,分析了sqlite文件等。最后,我把它确定为以下奇怪的行为:
情况:通过执行以下操作,将图像成功存储到核心数据中:
[self.detailItem setValue:UIImagePNGRepresentation(image) forKey:kSignatureImage];
,其中image
为UIImage
对象,self.detailItem
为NSManagedOBject
。键和引用,一切都很好。
然后再次显示视图。以下内容与上下文是否保存在中间或应用程序是否关闭并重新启动无关:
self.signatureCanvas.image = [UIImage imageWithData:[self.detailTextLabel valueForKey:kSignatureImage]];
, self.signatureCanvas
是UIImageView
的子类对象。图像不显示在屏幕上。
NSData *data = [self.detailItem valueForKey:kSignatureImage];
NSLog(@"UIImage a: %@", [UIImage imageWithData:[self.detailTextLabel valueForKey:kSignatureImage]]);
NSLog(@"UIImage b: %@", [UIImage imageWithData:data]);
self.testImage.image = [UIImage imageWithData:[self.detailTextLabel valueForKey:kSignatureImage]];
self.signatureCanvas.image = [UIImage imageWithData:data];
self.testImage
是同一个视图中的第二个普通UIImageView(但更小)。现在图像在signatureCanvas
中可见,但在testImage
中不可见。(反过来也可以,试过了)
输出提示发生了什么,但没有实际的解释:
2013-03-22 12:43:37.746 MyApp[1595:c07] UIImage a: (null)
2013-03-22 12:43:37.769 MyApp[1595:c07] UIImage b: <UIImage: 0x7c973a0>
到目前为止,我一直认为这两行代码是相当的,编译器甚至可能会优化数据对象。但是为什么图像(null)
在一种情况下,而不是在另一种情况下。
所以我找到了问题的根本原因和解决方法。因此,这已不再紧迫。但我不明白。有线索吗?
环境是:SDK 6.1, xcode 4.6, ARC, core data on sqlite, iPad目前为止。所有这些都发生在UITableViewCell子类(故事板中的原型单元格)中,自然发生在UITableViewController子类中。
我假设self.detailTextLabel
在
self.testImage.image = [UIImage imageWithData:[self.detailTextLabel valueForKey:kSignatureImage]];
应为self.detailItem