2012-03-14 39 views
1

在运行这样的代码:NSData的长度碰撞

[__NSCFArray length]: unrecognized selector sent to instance 0x2398a0 2012-03-13 20:25:33.088[7301:707] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray length]: unrecognized selector sent to instance 0x2398a0' * First throw call stack: (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) terminate called throwing an exception

这并未”:连接在设备上运行,只有当

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

我正在此崩溃错误(最后一行)在模拟器上运行或直接在具有分布配置文件的设备上运行(例如通过测试飞行)。

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

谢谢。

UPDATE:试图以取代计长,当我得到这个复杂的错误:“对‘NSData的’不可见@interface声明选择‘计数’”

UPDATE2:据我了解,它应该是一个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; 

} 
+0

1.是的,ARC已启用,2.我可以在一行中做到这一点,但我仍然需要声明它......不是吗? – TommyG 2012-03-14 00:41:24

+0

问题是你显然有声明为NSData的变量,但存储在变量中的指针是NSArray。这可能只是一个“愚蠢”的错误 - 为变量分配一个NSArray - 或者它可能是某种存储管理问题(并且它们不会随着ARC而消失,它们只是变得不同)。 – 2012-03-14 00:46:54

+0

我们可能需要查看序列化对象的位置,以便深入了解这一点。 – FluffulousChimp 2012-03-14 00:50:03

回答

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

Return Value The data object associated with the specified key, or nil if the key does not exist or its value is not an NSData object.

arrayForkey

Return Value The array associated with the specified key, or nil if the key does not exist or its value is not an NSArray object.

因此跳投使用适当的方法,当你知道的数据类型,以避免这样的问题。

+0

我认为你在做些什么...现在检查。 – TommyG 2012-03-14 00:55:07

+0

是的,它确实!谢谢一堆+1 – TommyG 2012-03-14 01:52:01

2

你的代码编写了两个问题:

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

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

希望这有助于:)

+0

我正在使用ARC,我之所以使用NSData是因为这是一个自定义对象的数组,所以当我存储它们时,我使用了归档...不知道该怎么做... – TommyG 2012-03-14 00:43:39

2

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

+0

请看我上面的更新 – TommyG 2012-03-14 00:46:12