iOS開發 for in 可變陣列 崩潰

2021-10-06 23:24:13 字數 1216 閱讀 4903

一、執行下面**會發生什麼?什麼解決?

nsmutablearray *array = [nsmutablearray arraywithobjects: @"122", @"333", @"444", nil];

for (nsstring *string in array)

答:會崩潰,提示nsgenericexception異常。出現下面的報錯資訊

意思是在列舉時,集合資料被修改了。

原因:因為for…in…利用了快速列舉nsfastenumerate,其在內部是用iterator(迭代器)實現遍歷的,一旦元素變動,之前的元素全部被失效,所以在for each的迴圈當中,最好不要去進行元素的修改動作,若需要修改,迴圈改為for遍歷,由於內部機制不同,不會產生修改後結果失效的問題。

1、使用普通for迴圈

nsmutablearray *array = [nsmutablearray arraywithobjects: @"122", @"333", @"444", nil];

for (int i = 0; i < array.count; i++)

2、使用copy乙個不可變陣列進行刪除

nsmutablearray *array = [nsmutablearray arraywithobjects: @"122", @"333", @"444", nil];

nsarray *copyarray = [array copy];

for (nsstring *string in copyarray)

3、使用enumerateobjectsusingblock(列舉器)來遍歷

nsmutablearray *array = [nsmutablearray arraywithobjects: @"122", @"333", @"444", nil];

[array enumerateobjectsusingblock:^(id obj, nsuinteger idx, bool * stop) ];

nsfastenumeration (快速列舉)

objective-c fast enumeration 實現原理

nsenumerator && nsfastenumerate

iOS可變陣列刪除某些元素

專案中有個需求,數量為0的卡不能傳給伺服器,不然開發票會有很多空卡 當時同事犯的錯誤是 直接在model.cardarray 這個可變陣列裡面進行迴圈,一邊迴圈,一邊匹配到裡面model數量為0的元素,進行刪除操作,反饋到這裡來的時候說原始陣列有8個元素,才迴圈了4次就結束了,導致裡面還有3個數量為...

C STL deque可變陣列

deque資料應該很多,這裡不多所了,直接一點上程式吧!include include include include 用於distance deque模板,deque迭代器 using namespace std stl deque 是乙個動態陣列,與vector類似 可在開頭與末尾插入 刪除資料...

結構可變陣列

開拓空間 array array create int init size 該段 用malloc來為結構體裡面的陣列指標分配乙個我們需要的空間,然後把位址分配給結構體裡面的array 為array結構體分配乙個空間並返回乙個array型別 用於主函式裡面array結構體型別直接複製 恢復空間,清空記...