问题标签 [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.
iphone - NSMutableArray 子类在取消归档时不调用子类的 initWithCoder
我有一个 NSMutableArray 的子类,其中包含各种配置信息及其正常的数组数据。
当我归档子类时,会调用子类的 encodeWithCoder 方法,但是当我取消归档时,永远不会调用 initWithCoder。但是,似乎调用了 NSMutableArray 的 initWithCoder 方法,因为它返回一个 NSMutableArray,而不是我的子类的实例。
关于发生了什么的任何想法?
ios - 如何调用 initWithCoder?
我有UIViewController
和UIView
子类(让我们说ViewSubClass
)。我正在使用故事板。在mainStoryBoard.storyBord
中,我放了一个UIView
并设置了自定义类ViewSubClass
。现在我不想创建ViewSubClass
in UIViewController
like的实例ViewSubClass *subClassInstance = [[ViewSubClass alloc] init]
。在不创建 in 的任何实例的情况下ViewSubClass
,ViewController
我想调用initWithCoder
方法。当我运行我的应用程序时,应该调用initWithCoder
方法。ViewSubClass
我怎样才能做到这一点?
iphone - 应用程序从背景恢复,NSManagedObject 的 nil 属性
条件
- 收到通知(txt 消息)
- 或开/关通知中心
- 或切换到另一个应用程序,回来
基本上,该应用程序会在短时间内从后台返回。
问题
布局还可以,但是从后台恢复后,我从 CoreData 获得的一些属性是空的。我几乎所有的视图控制器都存在这个问题。
该项目
这是一个应用程序,它有一个主标签栏控制器,标签内有两个导航控制器,可能还有两层视图控制器,它们有自己的子 UIViews(使用一些信息)。后端由 Parse 和 CoreData 组成。
奇怪的部分
从后台返回-> viewWillAppear 上的属性正常(创建 id 的备份)-> 它们在零秒后 -> 我需要手动取回它们(从我刚刚存储的 ID)
这是一个屏幕截图,当在每 5 秒调用一次的函数中放置一个断点以检查当前时间(更大的链接):
我做了什么
NSCoder 为状态恢复而实现,每个视图控制器都有一个恢复 ID,但是当应用程序处于活动状态时它不会被调用。我不认为 NSCoder 是这里的问题,因为从文档来看,当操作系统自行杀死它或强制用户退出时,它会被使用。
如果 NSManagedObjects 为 nil,我尝试从 NSNotificationCenter 手动刷新相应 ViewControllers 中的内容,但这不是面向未来的,并且在每个视图上都不是相同的逻辑。
有什么想法吗?谢谢!
我的 AppDelegate :
ios - 继承 NSCoder,重新创建 NSArchiver
NSArchiver
自 OS X 10.2 起已弃用,并且在 iOS 上不可用 AFAIK
另一方面,NSKeyedArchiver
众所周知,它缺乏速度和简洁性部分(一些用户NSKeyedArchiver
报告和之间的性能差异超过 100 倍NSArchiver
)。我要归档的对象主要是NSObject
包含NSMutableArray
of 的子类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
.
现在,所有这些都应该运行良好。事实上;我能够归档/取消归档我的一些对象。档案看起来不错,在某种程度上我愿意在十六进制编辑器中检查它们,并且我能够取消归档我的一些自定义类,其中包含NSMutableArray
s 的一些其他包含double
s 的类。
但是由于某种原因,如果我尝试取消归档包含 a NSMutableArray
of的对象之一NSNumber
,我会遇到这个问题:
NSNumber
数组中似乎有一行,并且0xc112cc
每一行的地址都是相同的。放一个断点malloc_error_break
告诉我错误来自-[NSPlaceholderNumber initWithCoder:]
(从我的_extractObject
方法调用)。
这与我对 ARC 的使用有关吗?我错过了什么?
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}}'
我不知道我的代码中出现错误的位置。
干杯卢克
ios - 编码 NSInteger 不适用于 64 位模拟器 - 目标 c
我对Objective c很陌生。在我的应用程序中,我想将一个由 NSString 和来自三个分段控件的三个 NSInteger 令牌组成的对象保存在 .plist 文件中。它在 32 位模拟器和设备上运行良好,但在 64 位中传递了一个空对象,因为我猜是 NSCoder。在我的对象类中,我实现了这两种方法:
我从分段控件中获取值:
和
我比较喜欢:
我保存对象:
我尝试以这种方式在 viewDidLoad 方法中检索保存的对象
{
}
cardSelected 是一个带有 .h 文件的对象 Card:
和实现 .m 文件为
' 使用对象 (Card) *cardSelected 时,它没有预期值。我究竟做错了什么?
ios - initWithCoder 如何与 Interface Builder 结合使用?
我有一个子类UITextField
,我在 Interface Builder 中使用它来构建我的视图(所以我直接在 Interface Builder 中将此对象的类设置为 MyCustomTextField)。
现在,我明白当视图被加载时,initWithCoder
: 方法MyCustomTextField
将被调用,这样我就可以做一些初始化工作。但是,我还发现我在 Interface Builder 中使用 Attribute Inspector 设置的属性并没有按照我设置它们的方式进行初始化!
有谁知道为什么会这样,以及我如何设法将 MyCustomTextField 实例的属性设置为我在 Interface Builder 的 Attribute Inspector 中设置的值?
objective-c - 如何从 NSCoder 获取文件的所有者
我正在尝试UIView
使用界面生成器将自定义子类嵌入到笔尖中,但自定义视图的笔尖位于另一个笔尖中。所以我使用awakeAfterUsingCoder:(NSCoder *)aDecoder
为自定义动态选择正确的笔尖UIView
。唯一的问题是文件的所有者没有被传递给新的笔尖。
NSCoder
我需要从传入的文件中获取 nib 的文件所有者,awakeAfterUsingCoder:(NSCoder *)aDecoder
以便在使用[nib instantiateWithOwner:owner options:nil];
.
任何人都知道如何从NSCoder
对象中获取文件的所有者?
ios - Segue 与 NSUserDefaults + NSCoder 对象
我在 segue 上崩溃了——断点在:
但如果我在调试器上“继续”,一切都会正常工作——应用程序似乎被挂断在这条线上......
我认为这与我的对象是 NSCoder 的 NSUserDefaults 的一部分有关...
我怎样才能使应用程序不会崩溃?!
我没有收到任何错误消息,只是一个断点错误
ios - NSCoder 游戏数据存储/检索健全性检查
只是想对该代码进行完整性检查,以存储和检索 iOS 7 的用户数据。它不起作用,但我没有看到问题。
游戏数据.h
游戏数据.m
存储数据:
检索数据:
我过去曾在一堆旧游戏概念(cocos2d)中使用过它,并且效果很好。
没有得到编译错误。只是不存储数据。
我已经有几年没有使用过这段代码了,而且它不起作用。iOS7 或 cocos2d v3 是否改变了 NSCoder 的使用方式?
还是我在某个地方犯了一个愚蠢的错误?
提前致谢。