问题标签 [nscoder]

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 投票
1 回答
320 浏览

objective-c - 应该对 NSCoder 二进制文件格式应用什么文件扩展名?

使用NSCoderand时NSKeyedArchiver,我了解数据以二进制格式存储。因此,存储文件最合适的文件扩展名是什么?许多教程使用.plist,但我相信这应该是文本属性列表~键/值对。

0 投票
2 回答
7183 浏览

objective-c - 做 NSCoder 启用类的简单方法

我有大量的对象要保存以供离线使用。目前,我使用创建符合 NSCoder 的类来将对象和编码数据归档以供离线使用。

所以在 .h 我介绍了对象:

在 .m 中,我进行初始化:

所以这个类只是带有 getter 和 setter 的虚拟存储。这里有更好的解码/编码方法吗?我可以以某种方式使用@dynamic 或键值编码进行编码和解码吗?基本上我希望类中的所有变量在程序启动时保存到文件并返回到对象。这种方法有效,但创建所有类需要时间和精力。

0 投票
2 回答
1752 浏览

objective-c - initWithCoder:中NSCoder有什么用?(可可和可可触摸)

NSCoder 在这里的作用是什么?

0 投票
1 回答
1066 浏览

ios - 使用子视图取消归档 UIImageView

我有点疯狂地试图归档和取消归档一个 UIImageView,它有许多子视图,这些子视图是从 UIImageView 派生的自定义视图。这是我所做的:

为项目添加一个类别以允许 UIImage 不符合 NSCoding 的事实:

我正在归档的 UIImageView 是我的主视图控制器的一个属性,称为“背景”。我这样保存:

然后我像这样解压它:

现在我想让我的子视图(或至少其中一个!)与未归档的根对象一起显示:

这是我添加到我的 ORUImageView 子类的内容:

我已经尝试过使用和不使用 image 属性的编码。

我怀疑问题与此属性有关,因为我显然将子视图添加到未归档视图中 - 它只是不可见!我觉得图像属性没有设置,但我找不到自己设置的方法,也找不到任何告诉我正确方法的东西。

0 投票
1 回答
6553 浏览

objective-c - NSCoder - 对数组进行编码,具有多层嵌套数组

我有一个 mainObjectArray (NSMutableArray),其中填充了自定义类的实例。每个实例本身就是一个数组,每个数组中的对象是 NSDates、NSStrings、BOOL 以及更多包含类似对象的数组。

我无法确定的是,在内部是否有可能

方法,就这么说吧:

还是必须分别对每个实例中的每个对象进行编码?这会有点痛...

您的帮助将不胜感激。

0 投票
3 回答
2101 浏览

objective-c - 枚举时集合发生了变异-归档数据并使用 NSCoder 写入文件

在我的应用程序中,我定期将一组动态数据写入文件。数据对象大约每秒更新一次。有时,我的 encodeWithCoder: 方法中的一行出现“集合在被变异时发生变异”异常。每个对象的编码如下:

其中 self.speeds 是一个 NSMutableArray。我认为问题在于数据在编码时正在更新。我尝试在编码保存块中使用@synchronize,并且我还尝试使属性原子而不是非原子,但都没有奏效。保存后台进行。关于如何在更新时将这些数据保存在后台的任何想法?我觉得制作副本然后保存副本会起作用,但不会出现同样的问题吗?谢谢!


编辑1:

应用程序中的想法是我打开一个地图视图,它定期更新一个包含数据对象数组的单例类,每个数据对象都是用户的地图信息。在每个数据对象中,用户的位置、速度、高度、距离等。位置管理器每 3 次更新用户的位置,我就更新当前数据对象(刚刚创建用于跟踪这次旅行的“实时”数据对象——任何时候都只能有一个“实时”数据对象)带有新信息。

我想每x分钟将整个单例写入一个文件,但有时写入和更新同时发生,我收到此错误(或者至少这是我认为导致此崩溃的原因)。我的代码或我的设计模式有问题吗?


这是我的自定义类中的编码方法:

这是更新方法(该方法中有更多代码和更新方法中调用的其他方法,但我省略了不引用“实时”dataObject对象的所有内容;正在更新的那个):

最后是类synchronize中的方法SingletonDataController(更新,以便现在根据 Tommy 的回答在异步块内发生同步):

其中 backgroundQueue 是这样创建的:

如果需要,我可以发布更多代码,但这些似乎是重要的部分。

0 投票
3 回答
97 浏览

ios - 保存数据所需的意见

我正在创建一个需要保存数组的应用程序。出于测试目的,我目前正在使用属性列表文件。我正在研究存储长期数据的其他方法。核心数据和 NSCoder 似乎很有希望。

我正在保存非常简单的数据,主要是数组

0 投票
1 回答
2162 浏览

ios - 在 initWithCoder 中:NSCoder(UINibDecoder)中的键是什么?(对于 UIImageView)

具体来说,我正在尝试查找图像路径。这将是一件非常有用的事情,据我所知,没有人知道如何获得。我查看了生成的 nib 文件中的密钥,并且可以在其中看到图像 URL (test.jpg),但找不到获取它的密钥。键“UIImage”返回实际已经构造的图像(通过调用上述初始化调用initWithCGImageStored:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation的神秘 UIKit 函数调用构造),所以这没有帮助。GetImageAtPath

我还尝试使用 NSKeyedArchiver 将 UIImageView 写入磁盘,但这些值似乎都不正确,test.jpg 值也不存在那里。

如果没有人能弄清楚 - 任何人都知道如何将二进制文件作为文本读取?我可以通读笔尖并解析出 URL,这总比没有好,但是无论我尝试什么格式,NSString 的构造函数都会失败。

0 投票
3 回答
1239 浏览

objective-c - 使用自动引用计数释放 self 的新模式是什么?

以 NSObject 方法-(id)awakeAfterUsingCoder:(NSCoder *)decoder为例,文档说:

允许一个对象在被解码后,用另一个对象代替它自己。例如,表示字体的对象可能在被解码后释放自身并返回与自身具有相同字体描述的现有对象。这样,可以消除多余的对象。

通常你会做

使用 ARC,您必须将这条线排除在外。这不会泄露吗?还是我应该相信 NSCoder 对象会为我释放原始对象?如果是这样,为什么您必须首先使用非 ARC 代码显式释放 self ?

self = nil鉴于编译器文档对自我的说法,我认为这是不正确的:http: //clang.llvm.org/docs/AutomaticReferenceCounting.html#misc.self

0 投票
0 回答
145 浏览

objective-c - 在解码对象时确定类

为了处理(几个)遗留通信协议,我尝试子类化NSCoder. 虽然编码工作正常,但我在解码时遇到了一些问题:协议不保留任何类型信息,但接收者“知道”消息的结构。我想知道,解码器如何确定对象(属性)属于哪个类。

对于 C 类型,这并不是真正的问题,因为可以调用decodeIntFromKeyetc。但对于对象,必须调用decodeObjector decodeObjectForKey:。文档告诉,那NSCoder是实现调用decodeValueOfObjCType:at:,即它知道类型。也许这些信息存储在存档器等中。但在我的情况下这不是真的。

现在,我正在告诉编码器下一个属性的类是什么:

我想,这不是一个非常优雅的解决方案。我想出的唯一其他方法是“滥用”类型信息的密钥。但是,在我的情况下,我需要密钥来确定协议中的相关对象。

因此我的问题是:解码器是否有一种优雅的方式来确定要解码的对象的类型,例如,通过回调拥有的对象?