IOS开发_中遍历数组的方法及比较

时间:2021-11-22 05:00:33

数组,做为一种常用的数据类型,频繁出现在编码中,其中肯定少不了对数组的遍历,本博文对数组遍历,进行一下自己的归纳,如果是大牛,一笑而过就好,互相学习,欢迎指正。

话不多说直接进入主题

首先创建一个数组

/** 获取系统的语言数组 */
NSArray *languageArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"];
  1. for 循环-C语言

因为在xCode 编译中支持C 语言, 所以第一种最常用的遍历方法就是for 循环,也是最常用的数组遍历方法。

for (int i = ; 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] 来实现, 暂时没有出现这种需求,这个方法我也只是知道而已,并没有使用过。

第三、for... in内部无法对数组进行删除操作,暂时只遇见这种问题,解决方法是用for 循环替代。

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 来进行实现,在遍历大数组的时候具有很强的效率优势。

欢迎指正,共同学习。