问题标签 [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 回答
952 浏览

iphone - 当我使用 NSKeyedArchivers / NSKeyedUnarchivers 时无法弄清楚为什么我的应用程序崩溃

我正在开发我的第一个 iphone 'Diary' 应用程序,它使用包含 NSString 标题、NSString 文本和 NSDate creationDate 的自定义 'Entry' 对象。当我尝试归档一个 NSMutableArray 的 Entry 对象,然后在下次加载视图时检索它们时,应用程序崩溃了。我已经浏览了一堆使用 NSKeyedArchivers 的示例代码和示例,但仍然无法弄清楚为什么会发生这种情况。我猜保存条目的数组的初始化存在问题,但不确定......

这是代码,也许你能找到我一直在监督的东西……”

非常感谢。

0 投票
2 回答
368 浏览

iphone - 关于深度复制示例的问题

在《Beginning iPhone 4》一书中,作者使用此代码创建了一个类别,用于创建一个 NSDictionary 的深层副本,该副本具有一个 NSArray 名称,用于显示字母表中每个字母的名称,以显示带有搜索栏的索引表的示例。

有人可以解释for循环逻辑吗?我不确定他在查看哪个值响应哪个选择器以及为什么将其添加到字典中要做什么。谢谢。

0 投票
1 回答
860 浏览

iphone - 带有自定义子对象的 NSCoding

我有一个服装对象,它引用了另一个自定义对象。如何在我的- (void)encodeWithCoder:(NSCoder *)encoder方法中的一个自定义对象中对自定义对象进行编码?

假设 name 是一个字符串,而 cObj 是另一个自定义 obj:

这会调用- (void)encodeWithCoder:(NSCoder *)encoder我的其他自定义对象吗?

谢谢你。

0 投票
3 回答
1673 浏览

uiview - 可插拔自定义视图 Nib (Nib-in-a-Nib):内存泄漏 - 为什么?

我们当前自定义视图的最佳实践是:

  1. 在 Nib 中构建自定义视图。
  2. 在视图控制器中,以编程方式加载 Nib,从加载的对象数组中获取自定义视图(我们在 UIView 类别方法中执行此操作+loadInstanceFromNib)。
  3. 添加自定义视图作为子视图,设置其框架。

我们真正想要的是在视图控制器 Nib 中“嵌入”自定义视图 Nib。如果做不到这一点,至少我们想在视图控制器 Nib 中添加和定位一个自定义视图实例(不看到它的内容)。

我们已经非常接近以下解决方案:

如果我们以编程方式实例化自定义视图,我们使用-initWithFrame:,它将从 Nib 加载视图(它将调用-initWithCoder:并直接转到标记为“步骤 2”的 if 分支),设置其框架,并将其保留计数设置为 1。

然而,如果我们在视图控制器 Nib 中实例化自定义视图,(诚然相当难看的)静态loadNormally变量最初是NO:我们从“步骤 1”开始,在确保我们将立即使用-initWithCoder:. 从自定义视图 Nib 加载意味着我们回到-initWithCoder:,这次使用loadNormally==YES,即我们让 Nib 加载机制完成其工作并返回自定义视图实例。

结果,总结:

  • 好的:它工作!我们在 Interface Builder 中有“可插入”的自定义视图!
  • 坏处:丑陋的静态变量……:-/
  • 丑陋的: 自定义视图的一个实例被泄露了!这就是我希望你帮助的地方——我不明白为什么。有任何想法吗?
0 投票
0 回答
283 浏览

iphone - 通过 sharedURL 传递归档数据

我目前有两个有点相似的应用程序,并且正在寻找一种在这两个应用程序之间共享数据的方法。我设置了一个共享网址和所有内容,并且可以毫无问题地从一个应用程序跳转到另一个应用程序。当我尝试通过 url 传递数据时出现问题。我在两个应用程序中都有一个彼此相同的类,并且依赖 NSKeyedArchiver 和解码器来对它们进行编码和解码,以及将它们编码为字符串以传递 url。

可以访问双方,我知道从应用程序 1 传递到应用程序 2 的数据是未受污染的,并且就像应用程序 1 对其进行编码一样到达。但我似乎无法解码另一边的数据!

我在这里对其进行编码:

然后我将其解码为:

还有更多我缺少的编码/解码自定义类吗?我确实在我的课堂上实施了 NSCoding 我认为的问题

因为它似乎总是为空?

谢谢!

我在编码后检查了输出,它就是这样

并在添加百分比转义后

我在解码部分添加了 NSLogs,它是一样的。我很困惑......修复了[unArchiver finishdecoding]的错位后;我现在得到错误

0 投票
0 回答
327 浏览

objective-c - How to encode NSNetService?

I have a class that has these two ivars:

I wanted to encode this into a NSData object eventually, so I implemented NSCoding:

However, when I try to use archivedDataWithRootObject it gives the errors:

-[NSNetService encodeWithCoder:]: unrecognized selector sent to instance 0x100170c40

-Exception detected while handling key input. -[NSNetService encodeWithCoder:]: unrecognized selector sent to instance 0x100170c40

-* -[NSKeyedArchiver dealloc]: warning: NSKeyedArchiver deallocated without having had -finishEncoding called on it.

How can I make NSNetService work with NSCoding?

0 投票
3 回答
10753 浏览

objective-c - 在 Cocoa 中将自定义对象写入 .plist

我挡住了一些东西,我确信它太大了。我有一个看起来像这样的自定义对象

以及实施

如您所见,它实现了 NSCoding(我认为是,NSObject 不符合 NSCoding)。现在,当我尝试做类似的事情只是为了测试

downloadArray是一个NSMutableArray。我的 plist 读/写很好,path位于应用程序支持中,当我登录时显示 plist 路径。

但它只是不将数组写入 plist,知道吗?

0 投票
1 回答
660 浏览

iphone - 从 NSCoder 解码对象时,最好的中止方法是什么?

我正在从缓存的序列化中解码自定义对象。我已经对对象进行了版本化++,因为它被编码了,如果序列化版本是旧版本,我想把它扔掉。我的印象是我可以从我的 initWithCoder: 方法返回 nil,一切都会好起来的。不过,这会引发错误。

编辑- 根据 NSObject 的 +version:文档“版本号适用于 NSArchiver/NSUnarchiver,但不适用于 NSKeyedArchiver/NSKeyedUnarchiver。键控存档器不编码类版本号。”。我正在使用键控存档器,因此这种方法无济于事。

我使用的是我自己的嵌入式版本号,而不是 NSObject 版本 + NSCoder 的 versionForClassName:。这是解决这个问题的方法吗?如果 Class 版本不匹配,NSCoder 会自动中止尝试解码,还是我需要手动进行此检查。

我目前正在这样做:

当它尝试解码旧版本时出现此错误

这一切看起来很奇怪,因为初始化程序可能由于多种原因而失败,并且在这种情况下模式是返回 nil,那么这真的会使解码器崩溃吗?

编辑- 根据Apple 的文档,听起来我正在以正确的方式处理这个问题。然而,如果一个对象是旧的和过时的,似乎没有一种完全中止解码的机制。我没有或不想要旧对象的升级路径,我该怎么办?

0 投票
1 回答
133 浏览

ios - 解码器通过蓝牙连接崩溃

我有一个想要通过蓝牙发送到另一台设备的对象。我已成功设置蓝牙连接并传输了编码的 NSString;但是,我还没有弄清楚如何正确使用归档和编码工具来发送对象。

我想发送下面定义的名为 ChatMessage 的对象。它实现了 NSCoding 委托方法 initWithCoder 和 encodeWithCoder ,如下所示。

在第二个代码片段中,我有用于发送和接收数据的代码,即导致调用解编码器的方法。

它一直在解码方法的最后一行崩溃。我一直在努力弄清楚出了什么问题。任何帮助将不胜感激!

在我看来,PeerPicker Delegate 函数的协议。

0 投票
0 回答
365 浏览

nsmanagedobject - 将 NSManagedObject 项的子类添加到 UIPasteboard - 剪切、复制、粘贴

我正在尝试在我的应用程序中实现剪切、复制、粘贴。我想在 UIPasteboard 上存储的项目是 NSManagedObject 的子类。

我遵循了这个答案,在我需要复制这些关系之前,它一直很棒。我从self.entity.attributesByName.allKeys

然后添加self.entity.relationshipsByName.allKeys

然后最终只使用self.entity.propertiesByName.allKeys

screenCDElementDict当我用声明归档时
[archiver encodeObject:screenCDElementDict forKey: @"TheObject"];

我收到一条错误消息:

-[MyNSManagesObjectRelation encodeWithCoder:]: unrecognized selector sent to instance 0x72db3d0

所以看起来它正在尝试复制关系实体,而不是指向实体的关系指针。

我不想复制实际的关系实体本身,只是指向它的指针。因此,当我粘贴新项目时,我会创建一个新的 NSManagesObject,然后可以将引用的实体从原始 NSManagedObject 关联到新的 NSManagedObject。

似乎手动复制所有属性和关系的全部原因是因为 encodeWithCoder 和托管对象不能很好地发挥作用。

即使提到必须调用的答案[super initWithEntity:insertIntoManagedObjectContext:]也没有提到任何关于复制指向实体关系的指针。

我也可以为每个关系实体 NSManagedObject 创建我的存档,但是当我创建新的 Master 时,我不会引用现有的关系实体,而是会创建一个新的...

谢谢,斯科特<-