2013-03-06 175 views
10

我,說一個例外:- [NSNull objectForKeyedSubscript:]:無法識別的選擇發送到實例

-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance

難道說我想用鑰匙訪問NSNull對象? 任何想法是什麼導致這一點,以及如何解決它或進一步調試?

+1

應該很容易找到。你在哪裏下標? – CodaFi 2013-03-06 01:12:19

+2

它看起來像你有一個NSNull你期待別的東西。有些代碼可以幫助人們幫你解決這個問題。 – 2013-03-06 01:12:23

+1

解決這個問題的方法是不要在NSNull對象上嘗試objectForKeyedSubscript。 (我敢打賭你正在處理一些JSON數據,並沒有準備好NULL值。) – 2013-03-06 01:17:01

回答

13

修復它的方法是不要在NSNull對象上嘗試objectForKeyedSubscript。 (我打賭你正在處理一些JSON數據,而不是空值)製備

(顯然objectForKeyedSubscript是什麼新的數組[X]符號轉換成)

(注你可以通過簡單地用==比較[NSNull null]測試NSNull,因爲有一個且只有一個在應用NSNull對象。)

+0

使用無效鍵訪問字典會拋出此異常嗎? – Boon 2013-03-06 01:40:47

+1

@Boon號會返回'nil',這與'NSNull'非常不同。 – 2013-03-06 02:12:47

+2

@Boon - 正如Mike D所說,在字典上使用無效鍵只會返回零 - 沒有例外。數組上的索引無效將引發異常,但它是一個NSRangeException,而不是「無法識別的選擇器」。但是,請注意,如果您嘗試「索引」NSString或NSView或其他非數組/字典對象,則會得到「無法識別的選擇器」 - 這是一個通用錯誤,意味着指定的類不支持指定的方法。 – 2013-03-06 02:37:32

2

儘管編輯器告訴你存儲了什麼值,但在運行時你正在存儲一個NSNull,稍後嘗試調用objectForKeyedSubscript。我猜想這發生在預期爲NSDictionary。有些東西,如:

NSString *str = dict[@"SomeKey"]

無論是一段代碼事先沒有做自己的工作,調查那裏,或者進行一些驗證:

NSDictionary *dict = ...; 

if ([dict isKindOfClass:[NSDictionary class]]) { 
    // handle the dictionary 
} 
else { 
    // some kind of error, handle appropriately 
} 

與打交道時,我常常有這種情況的來自網絡操作的錯誤消息。

1

我建議增加一個類別NSNull中,你會期望一個標以同樣的方式來處理這呼叫被處理,如果它被髮送到零。

@implementation NSNull (Additions) 

- (NSObject*)objectForKeyedSubscript:(id<NSCopying>)key { 
    return nil; 
} 

- (NSObject*)objectAtIndexedSubscript:(NSUInteger)idx { 
    return nil; 
} 

@end 

一個簡單的方法來測試是這樣的:

id n = [NSNull null]; 
n[@""]; 
n[0]; 

有了這個類,這種測試應該成功處理/輕聲。

相關問題