2012-03-14 77 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