NSCoding 和 NSData 是什么关系?

wz3*_*366 5 cocoa objective-c nscoding nsdata ios

我是 iOS 编程的新手,我刚刚学习了一些关于保存/加载对象的基础知识。在我的书中,有一个将图像保存到文件的示例:

NSData *data = UIImageJPEGRepresentation(someImage, 0.5);
[data writeToFile:imagePath atomically:YES];
Run Code Online (Sandbox Code Playgroud)

我的书还有一个将“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;
}
Run Code Online (Sandbox Code Playgroud)

essayStore.m

[NSKeyedArchiver archiveRootObject:self.myEssay toFile:somePath];
Run Code Online (Sandbox Code Playgroud)

我有三个问题:

  1. 什么时候应该使用 NSData 将对象保存到一个/多个文件,什么时候我应该遵守<NSCoding>协议将对象保存到一个/多个文件?

  2. 什么时候应该将所有对象保存到一个文件中,什么时候应该为每个对象保存一个文件?

  3. 如果我的论文对象中有图像,我如何将其与图像一起保存?

谢谢!

GoG*_*een 1

1. NSCoding是一种协议,是将数据保存到文件的方法之一。优点是如果使用此方法,您可以像这样存储对象。
NSData,如Apple类参考中提到的是typically used for data storage and are also useful in Distributed Objects applications, where data contained in data objects can be copied or moved between applications.

2。这取决于你需要保存数据。通常将所有对象存储在一个文件中就足够了,这些对象通常代表一个实体。

3 . 您可以参考以下教程:
- List item NSCoding Tutorial for iOS

编辑:

如果您想了解有关图像编码的信息,请查看此stackoverflow 答案
虽然编码图像不是我更喜欢的选择。正如 @Anoop Vaidya 在评论中提到的,复杂对象需要转换为原始数据。

是的,可以对您创建的类的对象进行编码。但你必须在其中实现 NSCoding 协议。以下链接是您所要求的二级编码的恰当示例:

希望这可以帮助!