2013-07-31 31 views
2

看起來這[__NSArrayI allKeys]: unrecognized selector sent to instance錯誤,它似乎發生在您發送一個NSArray的allKeys消息,這意味着爲NSDictionary,但在這種情況下,我非常清楚地發送它到NSDictionary。爲什麼我得到「[__NSArrayI allKeys]:無法識別的選擇器發送到實例」/爲什麼NSDictionary轉換?

下面是與掌上API接口,當我使用的代碼:

 NSDictionary *articles = [response objectForKey:@"list"]; 

     // Create an array we can use to sort the keys (and thus the articles) in order of when they were added 
     NSMutableArray *allKeys = [[articles allKeys] mutableCopy]; 

最後一行有導致錯誤。但是articles非常明確地聲明爲NSDictionary?爲什麼不喜歡它?

奇怪的是,如果我在運行時檢查它,它說它是一個NSArray!它爲什麼改變?

(lldb) po articles 
$5 = 0x082103e0 <__NSArrayI 0x82103e0>(

) 

(lldb) po [articles class] 
$6 = 0x01b83b8c __NSArrayI 
(lldb) 
+0

這可能是一個問題,你的指針指向一個NSMutable數組'allKeys'。看到這是一個方法名稱,它可能會導致一個問題。另外,你能否澄清'[迴應...'是什麼。 –

+0

響應是來自Pocket API的JSON響應。 –

回答

6

它可能在您的代碼中聲明爲字典,但這不會使它成爲一個字典。它確實是一個數組,這就是爲什麼你會得到異常。檢查你的response,這樣你就知道你應該期待什麼。

您的代碼編譯是因爲編譯器不知道它將成爲一個數組,並且它相信您將它作爲字典。它這樣做是因爲objectForKey:返回id

+0

'po [response class]'outputs'$ 4 = 0x01b83e34 __NSCFDictionary'雖然? –

+0

是的,答案是字典,但這並不意味着它包含的所有內容都是字典。 – Wain

+0

啊,夠公平的。通常'articles'是一個'NSDictionary',當它有很多來自響應的對象,但是當它不包含任何對象時,它似乎被當作一個'NSArray',對吧?我剛剛檢查過,當有大量物品進來時,我得到這個:'(lldb)po [articles class]; $ 3 = 0x01b83e34 __NSCFDictionary' –

相關問題