【问题标题】:NSKeyedArchiver cannot archive arraysNSKeyedArchiver 无法归档数组
【发布时间】:2011-12-03 17:16:38
【问题描述】:

我正在尝试开发 Cydia 调整,但现在我遇到了一些问题。

我想复制一个 NSMutableArray,所以我使用:

myArray = %orig;
NSMutableArray* myArray2;
myArray2 = myArray;
NSData* data = [NSKeyedArchiver archivedDataWithRootObject: myArray2];

(原来的函数返回一个 NSMutableArray,所以我用 myArray = %orig; 来获取)

但是,archivedDataWithRootObject 似乎不起作用,它总是导致我的设备崩溃。

那么,archivedDataWithRootObject 有什么限制吗?我不知道原始 NSMutableArray 是否已编码。我可以将 archivedDataWithRootObject 用于编码的 NSMutableArra 吗?

感谢您的任何建议和回复

【问题讨论】:

  • 能否提供崩溃日志?当 ObjC 应用程序转储核心时,它通常会打印出调用堆栈。我很高兴看看哪个函数崩溃了。您甚至可以使用 gdb 来检索它并查看回溯。
  • 似乎我无法获取它们,因为整个 iOS 崩溃(重新启动),我在 xcode 中找不到崩溃报告。
  • 我现在得到日志。它说“-[UIKBTree encodeWithCoder:]: unrecognized selector sent to instance 0xe8cdbe0”
  • 这是来自 NSCoding 协议encodeWithCoder: 的一种方法,我说过你必须实现它才能使用 NSKeyedArchiver 归档数据。

标签: objective-c ios nsmutablearray nsdata


【解决方案1】:

我不明白你代码中的这行代码:

myArray = %orig;

我不明白你为什么这样做:

NSMutableArray* myArray2;
myArray2 = myArray;

如果你有一个 NSArray 或一个 NSMutableArray 你将能够直接用那行代码对其进行编码:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject: myArray2];

但是(总是有但是...)
您的NSArray 中存储了什么?
如果你得到custom object,他们必须实现 NSCoding 协议才能参与存档舞会。

最后你说:

我想复制一个 NSMutableArray,所以我使用:

如果你只想复制NSMutableArray,你可以这样做:

[[NSMutableArray alloc] initWithArray:anArray];

我仍然没有看到 % 的标志。
如果你需要添加新对象,为什么不简单点,比如创建新对象。如果它是您自己的对象,您有 2 个选择:
首先,您在这些对象上实现 NSCopying 协议,使它们表现得像您想要的那样,或者
第二选择:如果数组包含一种类型的对象,您可以为这些对象创建一个 Class 方法,如下所示:newObjectWithArray:(* NSArray)theArray 并在该方法中您将 alloc init 初始化为接收对象的值的对象.

【讨论】:

  • 甚至[NSMutableArray arrayWithArray:anArray]
  • 是的,但我喜欢避免自动释放对象,除非需要它们。
  • 我使用 myArray = %orig;在 iOS 中获取函数返回的原始数组。我试图在同一个自定义对象中创建一个带有一些 int 的 NSMutableArray,但我可以使用 NSKeyedArchiver 来归档它们。我会尝试 [[NSMutableArray alloc] initWithArray:anArray];。 :)
  • VinceBurn:他没有说明,但他正在使用带有 Logos 语言的 Theos。它不是一个标准,只是一个方便的框架。但是,您说得对,数组中包含的所有方法都必须响应 NSCoding 方法。
  • 没有问题。顺便说一句,我确实喜欢避免使用这些非标准框架。很多开发者问我为什么不使用 Theos
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
相关资源
最近更新 更多