我在一个包含核心数据的应用程序项目中,我严格使用 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,sqlite 上的核心数据,iPad 到目前为止。所有这些都发生在 UITableViewCell 子类(情节提要中的原型单元)中,自然而然地发生在 UITableViewController 子类中。