for in遍歷和for 迴圈

2021-06-22 14:13:30 字數 1912 閱讀 4449

在做收藏功能的時候,使用的是把資料儲存到nsuserdefaults 中。過程是,現將要儲存的資訊用自定義的乙個model 儲存,再用nsmutablearray 把model 新增到陣列中,把陣列儲存到 nsuserdefaults中,使用的方法是 

nsuserdefaults*user = [nsuserdefaultsstandarduserdefaults];

[user setobject:data forkey:@"mycollection"];

[user synchronize];     // 這個方法一定要寫,否則會出現某些資料沒有儲存到 nsuserdefaults 中,  nsuserdefaults採用的是自動更新資料,資料的更新不是時時的,所以儲存到nsuserdefaults 後要馬上把資料用同步的方法更新  synchronize ;

因為自定義的類不能直接存到nsuserdefaults 中,要將model 所在的類進行 編碼,把資料轉為nsdata 型別,再存到nsuserdefaults中。

自定義的類要遵守nscoding 協議

在.m 檔案內實現編碼   

initwithcoder:

和解碼  

encodewithcoder: 

兩個方法

儲存的時候  要轉化為nsdata 型別  _newsdataarray 新增model 的陣列名

nsuserdefaults*user = [nsuserdefaultsstandarduserdefaults];

nsdata*data = [nskeyedarchiverarchiveddatawithrootobject:_newsdataarray];

[user setobject:data forkey:@"mycollection"];

[user synchronize];

解碼   

nsuserdefaults*defaults = [nsuserdefaultsstandarduserdefaults];

nsdata *data = [defaults objectforkey:@"mycollection"];

if (data == nil) else

data == 

nil 這個條件很重要,沒有的話,當data 是空時,就會引起程式的崩潰。

收藏功能,對資料有 收藏 和 取消收藏 兩種狀態。重點在於取消收藏時的方法,在這裡就遇到了問題,將陣列遍歷後刪除已收藏的資料時,在乙個頁面時反覆收藏和取消收藏都可以正常執行,但當在收藏列表中,每當取消收藏時程式就會崩潰。

**如下: 直接在for in 第一行就崩掉了。網上找到的解釋說是 陣列內容突變。

for (id obj in _newsdataarray) }}

最後把**改用 for 迴圈 結果可以執行了,在收藏列表頁面也可以取消收藏了。

for (int i = 0; i<_newsdataarray.count i>

}下面是在網上找的解釋

如果在for in 迴圈裡,對這個陣列進行了修改的話,無論是增,刪,修改陣列元素位置,都會扔乙個異常出來,錯誤是被遍歷的陣列已被銷毀(

<__nsarraym:> was mutated while being enumerated.

)nsarray的列舉操作中有一條需要注意:對於可變陣列進行列舉操作時,你不能通過新增或刪除物件這類操作來改變陣列容器。如果你這麼做了,列舉器會很困惑,而你將得到未定義的結果。

而本身這種操作也是有問題的,陣列容器已經改變,可能遍歷到沒有分配的位置,用for迴圈機器不能自己察覺,但是列舉器可以察覺。

for 迴圈和 for in 迴圈的區別

for 迴圈 塊一定的次數 for in 遍歷陣列或者物件的屬性 對陣列或者物件的屬性進行迴圈操作 注意 for in 迴圈會訪問該物件的原型,應該用在非陣列物件的遍歷上,不建議使用該方法遍歷陣列。示例 1 doctype html 2 html lang en 3 head 4 meta char...

for in 迴圈遍歷物件遇到的問題

當原型鏈上的可列舉屬性和目標物件的屬性同名時,原型鏈上的同名屬性會被忽略 a a.proto name ye for item in a console.log item name a.proto name2 ye for item in a console.log item name name2順...

for迴圈和for in的區別

for var i in arr 和for var i 0 i前者迴圈的是屬性,後者迴圈的才是陣列。如果專案中對陣列進行了擴充套件,不能使用前者,否者擴充套件陣列屬性時擴充套件的函式體也會被當成資料返回。比如說我們擴充套件乙個陣列屬性array.prototype.remove function v...