iOS使用NSUserDefaults的小細節問題

邏輯:從NSUserDefaults中讀出userList 若是userList中沒有這個email則將當前email添加userList,而後保存userList到UserDefaults 代碼以下: <!-- lang: cpp --> NSMutableArray *userList = [userDefaults objectForKey:@"userList"]; if(userList){ if(![userList containsObject:self.email]){ [userList addObject:self.email]; } }else{ userList = [NSMutableArray array]; [userList addObject:self.email]; } [userDefaults setObject:userList forKey:@"userList"]; [userDefaults synchronize];java

以上的問題其實與NSUserDefaults是沒有太大的關係。與O-c的id類型有關,由於[userDefaults objectForKey:@"xxx"]返回的是id類型。 上面的代碼跑起來大多數狀況是正常的,出錯的機率雖然比較小,但有時候會崩潰,錯誤信息以下安全

<!-- lang: java -->
2014-02-25 13:14:15.503 SAY[3725:70b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'

錯誤出在這一行代碼 <!-- lang: cpp --> [userList addObject:self.email];app

此時userList其實是NSArray的實例,雖然它被顯示的聲明爲NSMutableArray*.code

安全的寫法爲it

<!-- lang: cpp -->
NSMutableArray *userList = [NSMutableArray arrayWithArray:[userDefaults objectForKey:@"userList"]];
相關文章
相關標籤/搜索