设备上的NSdata长度崩溃

时间:2012-03-14 00:30:49

标签: iphone objective-c ios xcode nsdate

运行此代码时:

NSData *archivedSavedData = [[NSData alloc] init];    
archivedSavedData = [defaults objectForKey:@"listOfAccessNumbers"];
NSLog(@"archivedSavedData length is %d", [archivedSavedData length] );

只有在连接的设备上运行时,我才会收到此崩溃错误(最后一行):

  

[__ NSCFArray length]:无法识别的选择器发送到实例0x2398a0   2012-03-13 20:25:33.088 [7301:707] *由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSCFArray length]:无法识别的选择器发送到实例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;

}

3 个答案:

答案 0 :(得分:3)

错误消息显示:

-[__NSCFArray length]: unrecognized selector sent to instance

这意味着archivedSavedData是一个数组,并且它(显然)没有回复length因此您应该将archivedSavedData声明为数组并使用count代替

NSArray *archivedSavedData = [defaults objectForKey:@"listOfAccessNumbers"];
NSLog(@"archivedSavedData length is %d", [archivedSavedData count]);

现在,为什么在模拟器上运行时不会发生这种情况,我的猜测是你的测试场景不会让这部分代码被调用。

修改

如果您想要将数据检索为NSData,请使用方法dataForKey:

NSData *archivedSavedData = [defaults dataForKey:@"listOfAccessNumbers"];
NSLog(@"archivedSavedData length is %d", [archivedSavedData length]);

文档说明dataForKey

  

返回值   与指定键关联的数据对象,如果该键不存在或其值不是NSData对象,则为nil。

arrayForkey

  

返回值   与指定键关联的数组,如果键不存在或其值不是NSArray对象,则为nil。

当您知道数据的类型时,请使用适当的方法来避免这样的问题。

答案 1 :(得分:2)

编写代码时遇到两个问题:

1)您分配一个名为archivedSavedData的变量,您可以在不释放的情况下重新分配以下行。如果您正在使用ARC,这是可以的,但第一行是不必要的。

2)第二个问题是与defaults对象中存储的键@“listOfAccessNumbers”对应的对象是NSArray类型。 NSArray响应选择器计数,而不是长度。也许你应该仔细观察这个对象并进行相应的重新编码。

希望这会有所帮助:)

答案 2 :(得分:2)

这是因为[defaults objectForKey:@"listOfAccessNumbers"]返回NSArray,而不是NSData对象。