【问题标题】:What is the relationship between NSCoding and NSData?NSCoding 和 NSData 是什么关系?
【发布时间】: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];

我有三个问题:

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

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

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

谢谢!

【问题讨论】:

  • 这种关系并不像你想象的那么明显。 NSCoding 是一个协议,NSData 是一个不透明的包装类。也就是说,任何希望的类都可以通过符合 NSCoding 并使用正确类型的 NSArchiver 来序列化,但 NSData 不仅仅代表序列化的类。如果你想将一些东西持久化到磁盘,你有更多的选择,而不仅仅是 NSCoding,虽然它往往是最简单的。
  • @CodaFi 我可以使用 NSData 包装任何对象吗?
  • NSCoding 用于根据某些给定的键将复杂数据转换为原始类型,因为您不能将非原始数据对象写入文件。甚至图像也是一种复杂的数据类型。您需要将其转换为原始数据类型。
  • @AnoopVaidya“将其转换为原始数据类型”您的意思是 NSData 对象吗?
  • @wz366:原始类型包括int、char、float、long、double等

标签: ios objective-c cocoa nsdata nscoding


【解决方案1】:

1. NSCoding 是一种协议,是一种将数据保存到文件的方法。这样做的好处是,如果使用这种方法,您可以存储您的对象。
NSData,正如Apple class reference 中提到的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。您可以参考以下教程:
- 列表项NSCoding Tutorial for iOS

编辑:

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

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

希望这会有所帮助!

【讨论】:

  • 谢谢!我检查了你的教程,它没有提供保存包含图像的对象的方法。它像我的书一样单独保存图像。[aCoder encodeObject:self.essayTitle forKey:@"essayTitle"] 这里 self.essayTitle 是一个字符串对象,我可以对我创建的对象进行编码吗?
猜你喜欢
  • 1970-01-01
  • 2014-03-14
  • 2013-06-14
  • 2018-02-16
  • 2020-05-04
  • 2020-01-08
  • 2015-01-13
  • 2017-11-06
  • 2015-07-09
相关资源
最近更新 更多