一、使用for循環
優點:簡單
缺點:由于字典和集合內部是無序的,導致我們在遍歷字典和集合的時候需要借助一個新的『數組』作為中介來處理,多出了一部分開銷。
二、使用NSEnumerator遍歷
優點:對于不同的數據類型,遍歷的語法相似;內部可以簡單的通過reverseObjectEnumerator設置進行反向遍歷
缺點:代碼量稍大。
三、使用for...In遍歷
優點:1)語法簡潔;2)效率沒有for循環效率高;
缺點:無法獲得當前遍歷操作所針對的下標。
四、基于Block的遍歷方式
優點:
1)遍歷時可以直接從block中獲得需要的所有信息,包括下標、值等。特別相對于字典而言,不需要做多余的編碼即可同時獲得key和value的值。
2)能夠直接修改block中key或者obj的類型為真實類型,可以省去類型轉換的工作。
3)可以通過NSEnumerationConcurrent枚舉值開啟并發迭代功能。
說明:基于Block的遍歷方式在實現反向遍歷的時候也非常簡單,使用enumerateObjectsWithOptions方法,傳遞NSEnumerationReverse作為參數即可,在處理遍歷操作的時候推薦基于Block的遍歷方式。
五、使GCD中的dispatch_apply函數
使用GCD中的dispatch_apply函數也能實現字典、數組等的遍歷,該函數比較適合處理耗時較長、迭代次數較多的情況。示例如下:
//使用GCD中的dispatch_apply函數
-?(void)iteratorWithApply
{
//////////處理數組//////////
NSArray?*arrayM?=?@[@"1",@"2",@"3",@"4"];
//獲得全局并發隊列
dispatch_queue_t?queue?=?dispatch_get_global_queue(0,0);
dispatch_apply(arrayM.count,?queue,?^(size_t?index)?{
NSLog(@"%@--%@",arrayM[index],[NSThread?currentThread]);
});
}
優點:開啟多條線程并發處理遍歷任務,執行效率高。
缺點:1)對于字典和集合的處理需借助數組;2)無法實現反向遍歷。