在OC語言中铁孵,遍歷數(shù)組時(shí)會(huì)用到四種方式:
1锭硼、普通for循環(huán);2蜕劝、快速for循環(huán)檀头;3、特性block方式岖沛;4暑始、枚舉方式。
原以為OC的forin和 for是一樣的機(jī)制婴削,僅僅是形式不同而已廊镜。但在一次循環(huán)遍歷數(shù)組刪除指定元素的時(shí)候,卻意外的出錯(cuò)
比如下面的代碼:
但是用普通for循環(huán)卻不會(huì)出現(xiàn)問題:
而且有時(shí)候因?yàn)樵氐牟煌萑洌矔?huì)出現(xiàn)快速枚舉forin成功的情況
然后在錯(cuò)誤里面有這樣的提示:
Collection <__NSArrayM: 0x100601400> was mutated while being enumerated.
意思大概就是數(shù)組被枚舉時(shí)發(fā)生了突變期升。
顯然惊奇,快速枚舉for in和for循環(huán)在意義上還是有區(qū)別的互躬。經(jīng)過查閱,找到了這樣一句話:
快速枚舉的過程中不允許改變?nèi)萜髦械膶ο笏汤桑床辉试S刪除或者增加枚舉容器中的對象吼渡,因?yàn)閷τ谝粋€(gè)既定的枚舉器來說,其內(nèi)部的對象都已經(jīng)對其進(jìn)行了枚舉排序乓序,如果你私自添加或者刪除對象寺酪,那么其既定的枚舉序列就發(fā)生了改變,而這種改變時(shí)系統(tǒng)不能識(shí)別的替劈,所以O(shè)C中不允許這么做寄雀。但有時(shí)候我們也必須在快速枚舉的過程中刪除一些枚舉容器中的對象,這時(shí)候陨献,我們就需要在刪除完一個(gè)對象的時(shí)候盒犹,對其進(jìn)行break。
所以以后應(yīng)該使用for循環(huán)眨业,來對數(shù)組進(jìn)行增刪急膀、修改操作,這是應(yīng)該注意的地方