Iphone 设备上的NSdata长度崩溃

Iphone 设备上的NSdata长度崩溃,iphone,objective-c,ios,xcode,nsdate,Iphone,Objective C,Ios,Xcode,Nsdate,运行此代码时: NSData *archivedSavedData = [[NSData alloc] init]; archivedSavedData = [defaults objectForKey:@"listOfAccessNumbers"]; NSLog(@"archivedSavedData length is %d", [archivedSavedData length] ); 只有在连接的设备上运行时,我才在最后一行收到此崩溃错误: [\uu NSCFArray len

运行此代码时:

NSData *archivedSavedData = [[NSData alloc] init];    
archivedSavedData = [defaults objectForKey:@"listOfAccessNumbers"];
NSLog(@"archivedSavedData length is %d", [archivedSavedData length] );
只有在连接的设备上运行时,我才在最后一行收到此崩溃错误:

[\uu NSCFArray length]:发送到实例0x2398a0的无法识别的选择器 2012-03-13 20:25:33.088[7301:707]*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu 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 0x34D4C5 0x34d8f313 0x34A5 0xE324E034D1236D 0xE231E08E 0x31CFD38 终止引发异常的调用

例如,在模拟器上运行或直接在通过testflight发布配置文件的设备上运行时,不会发生这种情况

有人知道只有在这种情况下才会发生这种行为吗

谢谢

更新:当尝试用count替换length时,我得到了一个复杂的错误:“NSData”没有可见的@interface声明选择器“count”

更新2:我知道它应该是NSArray而不是NSData,但我的问题是我确实存储了存档的NSData,因为我的阵列由自定义对象组成,所以在NSUserDefault中保存时,我必须将此数据存档为NSData格式。否则我该怎么做

这就是我存储数据的方式:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
   [defaults setObject:data forKey:@"listOfAccessNumbers"];  
数组是自定义对象的数组,其形式为:

@interface NumberDataObj : NSObject {

    NSString *inputName;
    NSString *inputNum;

}

错误消息显示:

-[__NSCFArray length]: unrecognized selector sent to instance
这意味着archivedSavedData是一个数组,它显然不响应长度,所以您应该将archivedSavedData声明为数组,并使用count

现在,关于为什么在模拟器上运行时不会发生这种情况,我猜想您的测试场景不会使这部分代码被调用

编辑

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

文档中说,对于dataForKey:

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

对于ArrayWorkey:

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


因此,当您知道数据的类型时,通常会使用适当的方法来避免此类问题。

错误消息显示:

-[__NSCFArray length]: unrecognized selector sent to instance
这意味着archivedSavedData是一个数组,它显然不响应长度,所以您应该将archivedSavedData声明为数组,并使用count

现在,关于为什么在模拟器上运行时不会发生这种情况,我猜想您的测试场景不会使这部分代码被调用

编辑

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

文档中说,对于dataForKey:

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

对于ArrayWorkey:

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


因此,当您知道数据的类型时,通常会使用适当的方法来避免类似的问题。

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

1分配一个名为archivedSavedData的变量,该变量在下一行重新分配,而不释放。如果使用ARC,这是可以的,但是第一条线将是不必要的

2第二个问题是,与存储在默认对象中的键@ListofAccessNumber对应的对象是NSArray类型。NSArray响应选择器计数,而不是长度。也许你应该更仔细地观察这个对象,并相应地重新编码


希望这有帮助:

在编写代码时,您有两个问题:

1分配一个名为archivedSavedData的变量,该变量在下一行重新分配,而不释放。如果使用ARC,这是可以的,但是第一条线将是不必要的

2第二个问题是,与存储在默认对象中的键@ListofAccessNumber对应的对象是NSArray类型。NSArray响应选择器计数,而不是长度。也许你应该更仔细地观察这个对象,并相应地重新编码


希望这有帮助:

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

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

一,。是,ARC已启用,2。我可以在一行中完成这项工作,但我仍然需要声明它…否?问题是您显然将变量声明为NSData,但存储在变量中的指针是NSArray。这可能
这可能只是一个愚蠢的错误—将NSArray分配给变量—也可能是某种存储管理问题,它们不会随着ARC的出现而消失,只是会变得不同。我们可能需要查看您将对象序列化到何处,以便弄清问题的根源。那么,问题是否会出现,是不是NumberDataObj没有实现NSCoding协议?它确实实现了…我认为sch是解决方案之一。是,ARC已启用,2。我可以在一行中完成这项工作,但我仍然需要声明它…否?问题是您显然将变量声明为NSData,但存储在变量中的指针是NSArray。这可能只是一个愚蠢的错误—将NSArray分配给变量—也可能是某种存储管理问题,它们不会随着ARC而消失,只是会变得不同。我们可能需要看看您将对象序列化到何处,以便弄清问题的症结所在。那么,问题是,是不是NumberDataObj没有实现NSCoding协议?它确实实现了…我认为sch在解决方案中。我正在使用ARC,而我使用NSData的原因是因为这是一个自定义对象数组,所以当我存储它们时,我使用了存档…不确定其他方法如何实现…我正在使用ARC,我之所以使用NSData,是因为这是一个自定义对象数组,所以当我存储它们时,我使用了存档…不知道还有什么其他方法可以这样做…我想你正在做…现在检查。我想你正在做…现在检查。
NSData *archivedSavedData = [defaults dataForKey:@"listOfAccessNumbers"];
NSLog(@"archivedSavedData length is %d", [archivedSavedData length]);