【发布时间】:2014-03-27 04:00:34
【问题描述】:
我是 iOS 编程新手,刚刚学习了一些有关保存/加载对象的基础知识。在我的书中有一个将图像保存到文件的示例:
NSData *data = UIImageJPEGRepresentation(someImage, 0.5);
[data writeToFile:imagePath atomically:YES];
我的书还有一个将“essay”对象保存到文件的示例(“essay”对象有一个标题字符串和另一个作者字符串):
essay.m 符合<NSCoding> 协议:
- (void) encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.essayTitle forKey:@"essayTitle"];
[aCoder encodeObject:self.essayAuthor forKey:@"essayAuthor"];
}
- (instancetype) initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
_essayTitle = [aDecoder decodeObjectForKey:@"essayTitle"];
_essayAuthor = [aDecoder decodeObjectForKey:@"essayAuthor"];
}
return self;
}
在essayStore.m:
[NSKeyedArchiver archiveRootObject:self.myEssay toFile:somePath];
我有三个问题:
什么时候应该使用 NSData 将对象保存到一个文件中,什么时候应该遵循
<NSCoding>协议来保存对象到一个文件中?什么时候应该将所有对象保存到一个文件中,什么时候应该为每个对象保存一个文件?
如果我的论文对象中包含图像,我如何将其与图像一起保存?
谢谢!
【问题讨论】:
-
这种关系并不像你想象的那么明显。 NSCoding 是一个协议,NSData 是一个不透明的包装类。也就是说,任何希望的类都可以通过符合 NSCoding 并使用正确类型的 NSArchiver 来序列化,但 NSData 不仅仅代表序列化的类。如果你想将一些东西持久化到磁盘,你有更多的选择,而不仅仅是 NSCoding,虽然它往往是最简单的。
-
@CodaFi 我可以使用 NSData 包装任何对象吗?
-
NSCoding 用于根据某些给定的键将复杂数据转换为原始类型,因为您不能将非原始数据对象写入文件。甚至图像也是一种复杂的数据类型。您需要将其转换为原始数据类型。
-
@AnoopVaidya“将其转换为原始数据类型”您的意思是 NSData 对象吗?
-
@wz366:原始类型包括int、char、float、long、double等
标签: ios objective-c cocoa nsdata nscoding