前言:相對(duì)于有一定開(kāi)發(fā)經(jīng)驗(yàn)的猿,這樣的奔潰是比較好定位和解決的。
- 問(wèn)題復(fù)現(xiàn):當(dāng)我寫(xiě)了這樣一段代碼時(shí)運(yùn)行時(shí)
NSArray *name = @[@"kobe",@"rose",@"jack"];
NSDictionary *dict = @{@"name":name, @"wilson":@"8"};
// 有時(shí)候后臺(tái)會(huì)告訴我們,我這里會(huì)給你返回一個(gè)字典,你盡管這么取值就好了。但實(shí)際卻并不是這樣??
NSDictionary *testDict = dict[@"name"];
NSString *test = testDict[@"testName"];
NSLog(@"%@",test);
// 奔潰日志
[__NSArrayI objectForKeyedSubscript:]: unrecognized selector sent to instance 0x60000024fb40
Terminating app due to uncaught exception 'NSInvalidArgumentException'
reason: '-[__NSArrayI objectForKeyedSubscript:]: unrecognized selector sent to instance 0x60000024fb40'
從日志我們得到,對(duì)一個(gè)數(shù)組使用了objectForKeye方式取值,編譯器識(shí)別不了,拋出異常。
- 解決:需要做一層安全行判斷:
id testDict = dict[@"name"];
if ([testDict isKindOfClass:[NSDictionary class]]) {
NSString *test = testDict[@"testName"];
NSLog(@"%@",test);
}
我們平時(shí)寫(xiě)代碼時(shí),需要注意對(duì)數(shù)據(jù)類(lèi)型的判斷,防止類(lèi)似情況發(fā)生奔潰。在與后臺(tái)協(xié)調(diào)好數(shù)據(jù)結(jié)構(gòu)的前提下,還需要盡可能做一些安全性測(cè)試,比如數(shù)組或字典為空會(huì)不會(huì)崩潰?這都需要大量的代碼積累,開(kāi)發(fā)之路路漫漫兮。