数组,做为一种常用的数据类型,频繁出现在编码中,其中肯定少不了对数组的遍历,本博文对数组遍历,进行一下自己的归纳,如果是大牛,一笑而过就好,互相学习,欢迎指正。
话不多说直接进入主题
首先创建一个数组
/** 获取系统的语言数组 */
NSArray *languageArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"];
- 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 来进行实现,在遍历大数组的时候具有很强的效率优势。
欢迎指正,共同学习。