问题标签 [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 投票
0 回答
185 浏览

iphone - NSMutableArray 子类在取消归档时不调用子类的 initWithCoder

我有一个 NSMutableArray 的子类,其中包含各种配置信息及其正常的数组数据。

当我归档子类时,会调用子类的 encodeWithCoder 方法,但是当我取消归档时,永远不会调用 initWithCoder。但是,似乎调用了 NSMutableArray 的 initWithCoder 方法,因为它返回一个 NSMutableArray,而不是我的子类的实例。

关于发生了什么的任何想法?

0 投票
2 回答
4352 浏览

ios - 如何调用 initWithCoder?

我有UIViewControllerUIView子类(让我们说ViewSubClass)。我正在使用故事板。在mainStoryBoard.storyBord中,我放了一个UIView并设置了自定义类ViewSubClass。现在我不想创建ViewSubClassin UIViewControllerlike的实例ViewSubClass *subClassInstance = [[ViewSubClass alloc] init]。在不创建 in 的任何实例的情况下ViewSubClassViewController我想调用initWithCoder方法。当我运行我的应用程序时,应该调用initWithCoder方法。ViewSubClass我怎样才能做到这一点?

0 投票
1 回答
578 浏览

iphone - 应用程序从背景恢复,NSManagedObject 的 nil 属性

条件

  • 收到通知(txt 消息)
  • 或开/关通知中心
  • 或切换到另一个应用程序,回来

基本上,该应用程序会在短时间内从后台返回。

问题

布局还可以,但是从后台恢复后,我从 CoreData 获得的一些属性是空的。我几乎所有的视图控制器都存在这个问题。

该项目

这是一个应用程序,它有一个主标签栏控制器,标签内有两个导航控制器,可能还有两层视图控制器,它们有自己的子 UIViews(使用一些信息)。后端由 Parse 和 CoreData 组成。

奇怪的部分

从后台返回-> viewWillAppear 上的属性正常(创建 id 的备份)-> 它们在零秒后 -> 我需要手动取回它们(从我刚刚存储的 ID)

这是一个屏幕截图,当在每 5 秒调用一次的函数中放置一个断点以检查当前时间(更大的链接):在此处输入图像描述

我做了什么

NSCoder 为状态恢复而实现,每个视图控制器都有一个恢复 ID,但是当应用程序处于活动状态时它不会被调用。我不认为 N​​SCoder 是这里的问题,因为从文档来看,当操作系统自行杀死它或强制用户退出时,它会被使用。

如果 NSManagedObjects 为 nil,我尝试从 NSNotificationCenter 手动刷新相应 ViewControllers 中的内容,但这不是面向未来的,并且在每个视图上都不是相同的逻辑。

有什么想法吗?谢谢!

我的 AppDelegate :

0 投票
1 回答
534 浏览

ios - 继承 NSCoder,重新创建 NSArchiver

NSArchiver自 OS X 10.2 起已弃用,并且在 iOS 上不可用 AFAIK

另一方面,NSKeyedArchiver众所周知,它缺乏速度和简洁性部分(一些用户NSKeyedArchiver报告和之间的性能差异超过 100 倍NSArchiver)。我要归档的对象主要是NSObject包含NSMutableArrayof 的子类NSNumber,以及包含原始类型的对象(主要是double)。我不相信开销键控归档意味着值得。

所以我决定NSCoder在 iOS 上进行子类化,以创建一个串行编码器,其风格为NSArchiver.

我知道键控存档可能会派上用场:向后向前兼容性和其他细节,这可能是我最终将使用的,但我很想知道我可以通过串行存档获得什么样的性能。坦率地说,我认为我可以通过这样做学到很多东西。所以我对替代解决方案不感兴趣;

我受到了Cocotron的来源的启发,提供了一个开源NSArchiver

TLDR:我想子类NSCoder重建NSArchiver


我正在使用 ARC,为 iOS 6 和 7 编译,并假设现在是 32 位系统。

我现在对引用对象或字符串不感兴趣,我只是使用NSHashTable( weakObjectsHashTable) 来防止类名重复:类将在第一次遇到时进行描述,然后通过引用进行引用。

我正在使用 aNSMutableData来构建存档:

基本方法是:

_appendBytes:length:用来转储原始类型,例如 int, char, float, double... 等。那里没有什么有趣的。

使用这种同样无趣的方法转储 C 风格的字符串:

最后,归档类信息和对象:

我的对象的encodeWithCoder:方法都是这样的,没什么特别的:


解码方式几乎相同;unarchiver 拥有一个NSMapTable它已经知道的类,并查找它不知道的类引用的名称。

我不会用细节来烦你

有趣的东西可能在对象解码代码中:

最后,中心方法(如果问题出在此处,我不会感到惊讶)

initWithCoder:对应于前一个片段的方法会encodeWithCoder:像这样

我的decodeObject实现正是_extractObject.

现在,所有这些都应该运行良好。事实上;我能够归档/取消归档我的一些对象。档案看起来不错,在某种程度上我愿意在十六进制编辑器中检查它们,并且我能够取消归档我的一些自定义类,其中包含NSMutableArrays 的一些其他包含doubles 的类。


但是由于某种原因,如果我尝试取消归档包含 a NSMutableArrayof的对象之一NSNumber,我会遇到这个问题:

NSNumber数组中似乎有一行,并且0xc112cc每一行的地址都是相同的。放一个断点malloc_error_break告诉我错误来自-[NSPlaceholderNumber initWithCoder:](从我的_extractObject方法调用)。

这与我对 ARC 的使用有关吗?我错过了什么?

0 投票
2 回答
776 浏览

ios - iOS 7 SpriteKit 游戏 - 保存加载游戏时出错:'尝试将 nil 节点添加到父节点:名称:'(空)'

我正在创建一个解读文字游戏。

我已经到了可以使用以下方式保存/加载游戏的阶段:

  • (void)encodeWithCoder:(NSCoder *)aCoder

  • (instancetype)initWithCoder:(NSCoder *)aDecoder

当我第一次保存/加载游戏时没有问题。当我第二次按下主页按钮时,应用程序崩溃了,我最终遇到了一个我不知道如何理解的错误。

这是什么意思?

2014-01-11 18:23:12.254GameTest[16622:70b]由于未捕获的异常而终止应用程序

'Attemped to add nil node', reason: 'Attemped to add nil node to parent: <SKNode> name:'(null)' position:{0, 0} accumulatedFrame:{{inf, inf}, {inf, inf}}'

我不知道我的代码中出现错误的位置。

干杯卢克

0 投票
2 回答
644 浏览

ios - 编码 NSInteger 不适用于 64 位模拟器 - 目标 c

我对Objective c很陌生。在我的应用程序中,我想将一个由 NSString 和来自三个分段控件的三个 NSInteger 令牌组成的对象保存在 .plist 文件中。它在 32 位模拟器和设备上运行良好,但在 64 位中传递了一个空对象,因为我猜是 NSCoder。在我的对象类中,我实现了这两种方法:

我从分段控件中获取值:

我比较喜欢:

我保存对象:

我尝试以这种方式在 viewDidLoad 方法中检索保存的对象

{

}

cardSelected 是一个带有 .h 文件的对象 Card:

和实现 .m 文件为

' 使用对象 (Card) *cardSelected 时,它没有预期值。我究竟做错了什么?

0 投票
1 回答
344 浏览

ios - initWithCoder 如何与 Interface Builder 结合使用?

我有一个子类UITextField,我在 Interface Builder 中使用它来构建我的视图(所以我直接在 Interface Builder 中将此对象的类设置为 MyCustomTextField)。

现在,我明白当视图被加载时,initWithCoder: 方法MyCustomTextField将被调用,这样我就可以做一些初始化工作。但是,我还发现我在 Interface Builder 中使用 Attribute Inspector 设置的属性并没有按照我设置它们的方式进行初始化!

有谁知道为什么会这样,以及我如何设法将 MyCustomTextField 实例的属性设置为我在 Interface Builder 的 Attribute Inspector 中设置的值?

0 投票
0 回答
69 浏览

objective-c - 如何从 NSCoder 获取文件的所有者

我正在尝试UIView使用界面生成器将自定义子类嵌入到笔尖中,但自定义视图的笔尖位于另一个笔尖中。所以我使用awakeAfterUsingCoder:(NSCoder *)aDecoder为自定义动态选择正确的笔尖UIView。唯一的问题是文件的所有者没有被传递给新的笔尖。

NSCoder我需要从传入的文件中获取 nib 的文件所有者,awakeAfterUsingCoder:(NSCoder *)aDecoder以便在使用[nib instantiateWithOwner:owner options:nil];.

任何人都知道如何从NSCoder对象中获取文件的所有者?

0 投票
1 回答
82 浏览

ios - Segue 与 NSUserDefaults + NSCoder 对象

我在 segue 上崩溃了——断点在:

但如果我在调试器上“继续”,一切都会正常工作——应用程序似乎被挂断在这条线上......

我认为这与我的对象是 NSCoder 的 NSUserDefaults 的一部分有关...

我怎样才能使应用程序不会崩溃?!

我没有收到任何错误消息,只是一个断点错误

0 投票
0 回答
69 浏览

ios - NSCoder 游戏数据存储/检索健全性检查

只是想对该代码进行完整性检查,以存储和检索 iOS 7 的用户数据。它不起作用,但我没有看到问题。

游戏数据.h

游戏数据.m

存储数据:

检索数据:

我过去曾在一堆旧游戏概念(cocos2d)中使用过它,并且效果很好。

没有得到编译错误。只是不存储数据。

我已经有几年没有使用过这段代码了,而且它不起作用。iOS7 或 cocos2d v3 是否改变了 NSCoder 的使用方式?

还是我在某个地方犯了一个愚蠢的错误?

提前致谢。