问题标签 [nscoding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
278 浏览

objective-c - Objective-C – 使用 NSCoding 并将您的应用程序更新到 App Store

我正在使用NSCoding对我的对象进行编码并将它们作为“缓存”功能保存到磁盘,而不必在每次启动我的应用程序时下载数据。现在,我将此数据保存在应用程序的 Documents 文件夹中,更新应用程序时不会删除我已阅读的数据。

所以我担心的是我对我的类做了一些更新,比如添加一个实例变量。然后将应用程序上传到 App Store。因此,当用户更新到新版本时,保存在 Documents 文件夹中的旧对象在没有我在新版本中添加的新实例变量的情况下进行编码。这样当我的应用程序在启动期间尝试解码保存的对象时,它会失败,因为 Documents 文件夹中的“旧”对象没有使用这个新变量编码?

我将如何处理这个问题?确保我从一开始就“正确”地写我的课程?我确信我最终将需要修改我的一个类,然后破坏磁盘上保存的旧对象。

0 投票
1 回答
1428 浏览

iphone - 编码时 NSArray 对象会发生什么?

我正在构建一个利用 NSCoding 将 NSObject 保存到 documentPath 的应用程序。我这样做没有问题,我只是对某些事情感到好奇。

我有 MACompany,它实现了 NSCoding 委托方法。

如您所见,我有一个自定义 NSObjects (MAStore) 的 NSArray。这些对象中的每一个也实现了相同的 NSCoding 。

但是,我的问题是,当我encodeWithCoder:(NSCoder *)encoder在 MAStore 中调用方法时,如果实现[encoder encodeObject:stores forKey:kStores],存储在storesNSArray 中的所有对象都会调用该encoderWithCoder:(NSCoder *)encoder方法吗?

编辑

我问这个的原因是我想知道在我投入时间做这样的事情之前它是否会起作用。我有多个带有 NSArrays 的自定义 NSObjects,其中包含更多自定义 NSObjects。发现它不起作用将是一个漫长的过程。

0 投票
1 回答
891 浏览

objective-c - NSKeyedUnarchiver 没有调用 -initWithCoder: 在设备上(但在模拟器上没问题)

我正在编码我的对象并将其保存到文件中,如下所示:
[NSKeyedArchiver archiveRootObject:self.parent toFile:@"gameScene.plist"];

并将其解码如下:
scene = [[NSKeyedUnarchiver unarchiveObjectWithFile:@"gameScene.plist"] retain];

在模拟器中,上面的解码代码initWithCoder正确地调用了我的类的方法。但是当我在设备中运行相同的程序时,会返回“initWithCoder init”is not called nor the方法和一个“nil”对象。

谁能解释一下这里有什么问题?

编辑:init出于测试目的,我在and中给出了相同的语句集initWithCoder,而不是解码子对象initWithCoder并注释掉我的所有编码encodeWithCoder

0 投票
1 回答
438 浏览

iphone - 我究竟做错了什么?NSFileManager 问题

我目前正在构建一个相当大的 iPhone 应用程序。反正比我预期的要大。但这不是重点,该应用程序的总体思想是从 Web 服务中获取 JSON,将其全部分类为自定义 NSObject,这些 NSObject 链接在一起然后呈现。

这一切都很好。但是,因为我希望用户能够在没有互联网连接的情况下在设备上看到这些信息,所以我需要将我呈现的信息保存到每个应用程序拥有的 Documents 文件夹中。

我基本上将 NSCoding 协议实现到所有需要它的自定义 NSObject 中,以便将其保存到 Documents 目录的子目录中。

这一切都是通过这里的这个功能来实现的。

application didFinishLaunchingWithOptions:当用户首次加载应用程序 ( ) 和用户在后台打开应用程序 () 时,我执行以下请求applicationWillEnterForeground:

现在这一切都很好,我也可以从这个文件中提取。但是,当我将 Xcode 的调试器附加到应用程序时,我只能获取存储在此文件中的数据。一旦停止,数据就会损坏并且不包括原始数据。

数据仍然存储在那里,我可以看到创建的文件,但是存储在文件中的实际数据本身是错误的......

我不应该使用上述逻辑将数据保存到文件然后重新创建共享对象吗?有没有其他人试图做这样的事情并取得了成功?我遇到这个奇怪的问题有什么原因吗?其他人遇到过这个问题吗?

任何帮助将不胜感激,一直在尝试各种不同的方法来让它工作,但没有任何东西能够到达那里。我需要做的就是能够将数据永久存储在那里,直到我需要更新它......

0 投票
1 回答
1567 浏览

objective-c - 将带有 UIImages 的 NSMutableArray 保存到 NSUserDefaults

我试图将包含五个 UIImages 的 NSMutableArray 保存到 NSUserDefaults 并且没有用。我收到警告

好的,好像我需要将我的数组存档到 NSData 中。但是我如何让 UIImage 符合 NSCoding 呢?我应该先将图像转换为 NSData 还是有更简单的方法?

0 投票
2 回答
1310 浏览

objective-c - 目标 C:我正在尝试保存一个包含原语和对象的 NSDictionary,但是在我尝试添加自定义对象时发生错误

所以我有一个名为“Box”的自定义对象,它会为那个对象抛出错误。我的 NSDictionary 里面是......

请注意我在顶部创建并在最后添加到 NSDictionary 中的框对象。在没有盒子之前,一切正常,但是当我添加自定义对象“盒子”时,它无法保存了。

这是错误

任何帮助将不胜感激!!!!

0 投票
1 回答
337 浏览

objective-c - 我在哪里可以找到 Objective C 的通用游戏状态单例?

我想在 NSCoder 中使用和存储游戏状态单例,但我发现很难找到使用 NSKeyedArchiver/NSCoder 例程保存和加载其数据的通用状态管理。

我想知道是否有人可以指导我学习一个好的教程,或用作游戏状态单例的通用代码,并在 NSCoder 中保存/加载?

谢谢

0 投票
1 回答
2252 浏览

objective-c - 如何对 NSCoding 进行单元测试?

我有一个使用 NSCoding 更准确地说是 NSKeyedArchiver 保存数据的 iOS 应用程序。此应用程序已在 App Store 上提供。

我正在开发应用程序的第 2 版,并且数据模型应该更改。所以我需要处理数据模型迁移。我希望它被单元测试覆盖。

在我的测试中,我想使用旧数据模型动态生成持久数据,启动迁移并查看一切是否顺利。

目前,归档对象如下所示:

问题是,MyDataModelObject 可能在应用程序的版本 2 中被重构甚至删除。所以我不能在我的测试中使用这个类来生成一个“旧版本存档”。

encodeWithCoder:有没有办法在不使用此类的情况下模拟类的方法中所做的事情?


我想要实现的是以下

0 投票
2 回答
612 浏览

objective-c - 当子类化 NSCoder 时,我是否还需要子类化集合类(即:NSArray、NSDictionary)?

我正在探索子类化NSCoder以读取/写入专有文件格式的想法。我开始相信这可能还需要我进行子类化NSArrayNSDictionary覆盖encodeWithCoder:以确保它们被正确编码:

我不愿意这样做,因为NSCoder它的相关协议NSCoding应该是自给自足的......要求遵循协议的子类化似乎是糟糕的设计。我是误会还是想多了?!?

详细说明:
例如,如果文件格式规定项目列表编码如下:

我想要编码一个数组,它encodeWithCoder:需要看起来像这样:

因为我忽略了 NSArray 的encodeWithCoder:实现方式,所以我想我必须重写它才能正确使用我的 NSCoder 类。

0 投票
3 回答
5393 浏览

objective-c - 如何将 NSValue 转换为 NSData 并返回?

A 有一些NSValue(通过 KVC 获得valueForKey)我需要附加到一个NSData对象,以便使用 Game Center 通过网络发送它。显然,我还需要NSValue从后面转换NSData为更多的 KVC ( setValue:forKey:)。

我不知道 each 的确切类型NSValue,所以我仅限于使用NSValueand提供的接口NSData。我应该提一下,从NSValue不是指针类型。

我很惊讶没有[NSData dataWithValue:value],也没有类似[value dataWithEncoding:]或类似的东西。但也许我是盲人,没有看到明显的选择。我考虑过使用getValue:将值复制到缓冲区中,但是除了使用所有可能的类型并将其与所有可能的类型进行比较void*之外,我应该如何确定缓冲区长度?objCType

我该怎么办?

注意: NSKeyedArchiver这是不可能的,因为它非常低效。一个 4 字节的浮点数被归档到 142 字节NSData,一个 8 字节的浮点数在归档到CGPoint时使用 260 字节NSData。将发送的数据量保持在最低限度对我正在做的事情至关重要。