我,說一個例外:- [NSNull objectForKeyedSubscript:]:無法識別的選擇發送到實例
-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance
難道說我想用鑰匙訪問NSNull
對象? 任何想法是什麼導致這一點,以及如何解決它或進一步調試?
我,說一個例外:- [NSNull objectForKeyedSubscript:]:無法識別的選擇發送到實例
-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance
難道說我想用鑰匙訪問NSNull
對象? 任何想法是什麼導致這一點,以及如何解決它或進一步調試?
修復它的方法是不要在NSNull對象上嘗試objectForKeyedSubscript。 (我打賭你正在處理一些JSON數據,而不是空值)製備
(顯然objectForKeyedSubscript是什麼新的數組[X]符號轉換成)
(注你可以通過簡單地用==
比較[NSNull null]
測試NSNull,因爲有一個且只有一個在應用NSNull對象。)
使用無效鍵訪問字典會拋出此異常嗎? – Boon 2013-03-06 01:40:47
@Boon號會返回'nil',這與'NSNull'非常不同。 – 2013-03-06 02:12:47
@Boon - 正如Mike D所說,在字典上使用無效鍵只會返回零 - 沒有例外。數組上的索引無效將引發異常,但它是一個NSRangeException,而不是「無法識別的選擇器」。但是,請注意,如果您嘗試「索引」NSString或NSView或其他非數組/字典對象,則會得到「無法識別的選擇器」 - 這是一個通用錯誤,意味着指定的類不支持指定的方法。 – 2013-03-06 02:37:32
儘管編輯器告訴你存儲了什麼值,但在運行時你正在存儲一個NSNull
,稍後嘗試調用objectForKeyedSubscript
。我猜想這發生在預期爲NSDictionary
。有些東西,如:
NSString *str = dict[@"SomeKey"]
無論是一段代碼事先沒有做自己的工作,調查那裏,或者進行一些驗證:
NSDictionary *dict = ...;
if ([dict isKindOfClass:[NSDictionary class]]) {
// handle the dictionary
}
else {
// some kind of error, handle appropriately
}
與打交道時,我常常有這種情況的來自網絡操作的錯誤消息。
我建議增加一個類別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];
有了這個類,這種測試應該成功處理/輕聲。
應該很容易找到。你在哪裏下標? – CodaFi 2013-03-06 01:12:19
它看起來像你有一個NSNull你期待別的東西。有些代碼可以幫助人們幫你解決這個問題。 – 2013-03-06 01:12:23
解決這個問題的方法是不要在NSNull對象上嘗試objectForKeyedSubscript。 (我敢打賭你正在處理一些JSON數據,並沒有準備好NULL值。) – 2013-03-06 01:17:01