標籤:
數組,做為一種常用的資料類型,頻繁出現在編碼中,其中肯定少不了對數組的遍曆,本博文對數組遍曆,進行一下自己的歸納,如果是大牛,一笑而過就好,互相學習,歡迎指正。
話不多說直接進入主題
首先建立一個數組
/** 擷取系統的語言數組 */NSArray *languageArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"];
- for 迴圈-C語言
因為在xCode 編譯中支援C 語言, 所以第一種最常用的遍曆方法就是for 迴圈,也是最常用的數組遍曆方法。
for (int i = 0; i < languageArray.count; i++) { NSLog(@"languageArray[%d] = %@", i, languageArray[i]); }
得到的列印結果是 languageArray[對應下表] = 數組中的值
這種方法簡單,效率一般,優點有三種,
第一、方便針對下標進行處理;
第二、可以方便的進行反向遍曆;
第三、兩個for 迴圈嵌套時,可以進行冒泡排序,冒泡排序的代碼,就不附綴了。
2.for...in 迴圈,也有稱為快速for迴圈 (Objective-C-2.0 時出的方法)
for (id object in languageArray) { NSLog(@"languageArray=%@", object); }
這種遍曆方法,號稱是效率第一,也是我編碼中的首選,較比for 迴圈而言,更簡潔,但是需要一個外部變數來實現,不便之處,暫時遇見過兩種:
第一、如果代碼需求要求要知道下標,這個方法就會顯的不再那麼好用。
第二、反向遍曆需要通過 [languageArray reverseObjectEnumerator] 來實現, 暫時沒有出現這種需求,這個方法我也只是知道而已,並沒有使用過。
3、iOS 應該是在2011年的開發人員大會上推出了 block塊的用法,到目前為止,已經有很多年頭,業界對 block塊的評價褒貶不一, 一名外國程式員還專門創立了一個網站稱為FuckBlock, 以此來抨擊iOS 推出的block, 但是,block 在最佳化代碼提高編譯效率方面的確是很贊的,在數組遍曆中有兩種block :【enumerateObjectsUsingBlock】 和 【enumerateObjectsWithOptions:usingBlock】,前者一般用於正序遍曆,後者用於反向遍曆。
首先是【enumerateObjectsUsingBlock】
[languageArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"idx=%d, id=%@", idx, obj); }];
【enumerateObjectsUsingBlock】block裡面的參數包括object,下標以及是否停止遍曆而 【enumerateObjectsWithOptions:usingBlock】多傳了一個指定遍曆順序的參數
[languageArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"idx=%d, id=%@", idx, obj); }];
【enumerateObjectsWithOptions:usingBlock】 在遍曆小數組的時候不推薦使用,效率差距不是很明顯,但是在遍曆大型數組時建議使用該block 塊, 在該block 底層使用GCD 來處理並發執行事宜,所以應該有用到 dispatch group 來進行實現,在遍曆大數組的時候具有很強的效率優勢。
歡迎指正,共同學習。
IOS 開發中遍曆數組的方法及比較