【发布时间】:2012-03-14 00:30:48
【问题描述】:
运行此代码时:
NSData *archivedSavedData = [[NSData alloc] init];
archivedSavedData = [defaults objectForKey:@"listOfAccessNumbers"];
NSLog(@"archivedSavedData length is %d", [archivedSavedData length] );
只有在连接的设备上运行时,我才会收到此崩溃错误(最后一行):
[__NSCFArray 长度]:无法识别的选择器发送到实例 0x2398a0 2012-03-13 20:25:33.088[7301:707] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFArray 长度]:无法识别的选择器发送到实例 0x2398a0” * 首先抛出调用栈: (0x34dbc88f 0x361e3259 0x34dbfa9b 0x34dbe915 0x34d19650 0xccb1b 0x31e13e33 0x31e38629 0x31dfcd7d 0x31ebf4dd 0x31e0555d 0x31e05579 0x31e0540b 0x31e053e7 0xcfedf 0x31e12e53 0x31e0c985 0x31ddac6b 0x31dda70f 0x31dda0e3 0x3600f22b 0x34d90523 0x34d904c5 0x34d8f313 0x34d124a5 0x34d1236d 0x31e0ba13 0x31e08e7d 0xcfd39 0xcbe28) 终止称为抛出异常
在模拟器上运行或直接在具有分发配置文件的设备上运行时不会发生这种情况(例如通过 testflight)。
有谁知道只有在这种情况下才会发生这种行为?
谢谢。
更新:当尝试用 count 替换长度时,我收到了这个复杂错误:“'NSData' 没有可见的@interface 声明选择器'count'”
UPDATE2:我知道它应该是 NSArray 而不是 NSData,但我的问题是我确实存储了存档的 NSData,因为我的数组包含自定义对象,所以我必须在保存 NSUserDefault 时将此数据存档为 NSData 格式.否则我应该如何处理?
这就是我存储数据的方式:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
[defaults setObject:data forKey:@"listOfAccessNumbers"];
array 是一个自定义对象的数组,形式为:
@interface NumberDataObj : NSObject {
NSString *inputName;
NSString *inputNum;
}
【问题讨论】:
-
1.是的,ARC 已启用,并且 2. 我可以在一行中执行此操作,但我仍然需要声明它...否?
-
问题是您显然将变量声明为 NSData,但存储在变量中的指针是一个 NSArray。这可能只是一个“愚蠢”的错误——将 NSArray 分配给变量——或者它可能是某种存储管理问题(它们不会与 ARC 一起消失,它们只是变得不同)。
-
我们可能需要查看您在哪里序列化您的对象,以便深入了解。
-
那么问题是
NumberDataObj没有实现NSCoding协议吗? -
它确实...我认为 sch 是解决方案。
标签: iphone objective-c ios xcode nsdate