【发布时间】:2014-12-29 01:50:06
【问题描述】:
当尝试将 UIImage 保存到 CoreData 持久存储时,我收到以下错误:
NSConcreteMutableData CGImage]:无法识别的选择器发送到实例 0x7fe85a4b5cd0 2014-12-28 20:27:16.307 MyAppName[1578:245578] 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSConcreteMutableData CGImage]:无法识别的选择器发送到实例 0x7fe85a4b5cd0”
在setImage(image: UIImage) 函数的self.image = data 行引发异常。
这里是我创建 UIImage 实例的地方:
let ipaIcon = CoreData.newIconWithImageAndName(UIImage(named: "IPA-Day.png")!, name: "IPA-Day")
这个函数在我的数据访问层:
class func newIconWithImageAndName(image:UIImage, name:String) -> Icon?
{
if(Icon.ExistsInStorage(name))
{
return nil
}
var description = NSEntityDescription.entityForName(Lookup.EntityName.Icon.rawValue, inManagedObjectContext: context)
var newIcon = Icon(entity: description!, insertIntoManagedObjectContext: context)
newIcon.setImage(image)
newIcon.name = name
var saveError: NSError?
context.save(&saveError)
if let error = saveError
{
println("Error creating new icon with image and name: \(name)")
return nil;
}
return newIcon
}
这是我保存将图像转换为 NSData 并尝试将其设置为托管对象的 NSData 属性的代码:
func setImage(image: UIImage)
{
let data: NSData = UIImagePNGRepresentation(image)
self.image = data
}
这是我的 xcdatamodel 的屏幕截图:
*** 我正在使用 Swift(1.1) 运行最新版本的 Xcode(6.1)。
【问题讨论】:
-
您的属性名称和自定义设置器之间存在冲突。这就是造成问题的原因。
-
请使用您设置图像的代码更新您的帖子。
-
我只是有一个建议,在数据库上保存一个很小的图像并不是一个好主意。因此,如果您没有任何具体理由这样做,我宁愿保存图像路径和延迟实例化图像。假设您在内存中加载 100 个 NSData 对象的 100 个图标,它们很快就会填满设备内存。
-
@AdeelUrRehman,我已经用您要求的代码更新了帖子。
-
@Andrea,我会接受你的建议。我已经阅读了一些关于它的内容,这似乎是合理的。我倾向于在 CoreData 中保存图像,因为对象将来自服务器,但即使在这种情况下,我认为我仍然应该将图像保存到文件系统中。不过,我仍然对我的问题感兴趣。我在 Obj.-C 中以相同的方式保存了图像并且效果很好,所以我很好奇为什么这不起作用。谢谢。
标签: ios iphone core-data swift uiimage