不可變字典和可變字典的誤區

2021-09-19 16:06:38 字數 1471 閱讀 7699

突然想著set乙個值進去,為了方便點,在同乙個物件中拿值,結果竟然崩潰,百思不得其解,後來通過property的方式傳值過去。第二天早上仔細研究了下 ,原先的流程是一開始在didload裡面建立了可變字典 

- (void)viewdidload {

[super viewdidload];

[_mtableview setbackgroundcolor:[uicolor clearcolor]];

[self settitle:@"新增銀行卡"];

_mtableview.tablefooterview=_footview;

_footview.backgroundcolor=clearcolor;

diccardbin=[[nsmutabledictionary alloc] init];

// do any additional setup after loading the view.

請求資料的時候      diccardbin =(nsmutabledictionary *)responsedata;

[diccardbin setobject:[celltwo.mtextfield.text delectspace] forkey:@"bankcard"]; //此時崩潰

問了楠哥,楠哥很嚴肅反問,不可變字典轉可變字典是這樣轉的嗎?當時就感覺可能就是這個地方錯了,雖然這麼賦值diccardbin是可以接到伺服器返回來的值,可以作為後面的處理,但是其實還是屬於不可變字典,儘管定義和構造看起來是不可變的,原因正是出在這裡,因為本人覺得不可變字典雖然setvalue不可用,但是不至於setobject也不可用吧! 經過楠哥指點,加上我當時頓悟,立馬回去改寫,執行了下,完全沒有問題,一次過!

改寫是這樣的,didload立馬方法注釋掉//diccardbin=[[nsmutabledictionary alloc] init];

在請求的時候

if (responsedata) {

//得到使用者輸入卡的型別

//                            diccardbin =(nsmutabledictionary *)responsedata;

diccardbin=[[nsmutabledictionary alloc] initwithdictionary:responsedata];

[diccardbin setobject:[celltwo.mtextfield.text delectspace] forkey:@"bankcard"];

這麼處理就可以了。看起來很簡單,不遇到問題和聯絡實際場景,根本感覺不到。

最早寫這個的時候,當時就是怕寫在請求裡面會構造多次,還要做非空判斷,太麻煩,倒不如直接didload裡面早點構造了算了,結果三年後,自己的坑自己去踩。最基礎的其實還是最重要的。那些你理解不了的基礎還是要從專案中實踐。

OC 字典(可變不可變都有 )

字典 nsdictionary 1.概念字典是關鍵字 key 及其定義的值 value 所構成的集合,即它是由key value組成的鍵值對的集合。key 一般是 nsstring 型別的,value 是oc中任意物件。對於字典來講,我們就是通過 key 來訪問 value 2.為什麼在有了陣列之後...

可變和不可變

可變和不可變 不可變 物件所指向的記憶體中的值是不可以改變 不可變型別 int ser float 元組tuple num 10s1 abc print id s1 s1 abcd print id s1 t1 2 5,6 print id t1 t1 2 5 print id t1 可變的 物件所...

oc75 不可變字典NSDictionary

nsdictionary import int main int argc,const char ar 注意 key和value 是一一對應 nsdictionary dict2 nsdictionary dictionarywithobjects lnj 30 1.75 forkeys name ...