一、使用for循环

  要遍历字典、数组或者是集合,for循环是最简单也用的比较多的方法,示例如下:

 //普通的for循环遍历
-(void)iteratorWithFor
{
//////////处理数组//////////
NSArray *arrayM = @[@"1",@"2",@"3",@"4"];
NSInteger arrayMCount = [arrayM count];
for (int i = 0; i<arrayMCount; i--) {
    NSString *obj = arrayM2[i]; NSLog(@"%@",obj);
   }
}

  优点:简单

  缺点:由于字典和集合内部是无序的,导致我们在遍历字典和集合的时候需要借助一个新的『数组』作为中介来处理,多出了一部分开销。

二、使用NSEnumerator遍历

  NSEnumerator的使用和基本的for循环类似,不过代码量要大一些。示例如下:

  //使用NSEnumerator遍历
-(void)iteratorWithEnumerator
{
//////////处理数组//////////
NSArray *arrayM = @[@"1",@"2",@"3",@"4"];
NSEnumerator *arrayEnumerator = [arrayM objectEnumerator];
NSString *obj;
while ((obj = [arrayEnumerator nextObject]) != nil) {
NSLog(@"%@",obj);
}
    //////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];
NSEnumerator *arrayEnumerator2 = [arrayM2 reverseObjectEnumerator];
NSString *obj2;
while ((obj2 = [arrayEnumerator2 nextObject]) != nil) {
NSLog(@"%@",obj2);
}
}

  优点:对于不同的数据类型,遍历的语法相似;内部可以简单的通过reverseObjectEnumerator设置进行反向遍历。

  缺点:代码量稍大。

三、使用for...In遍历

  在Objective-C 2.0 中增加了for ...In 形式的快速遍历。此种遍历方式语法简洁,速度飞快。示例如下:

  //使用for...In进行快速遍历
-(void)iteratorWithForIn
{
//////////处理数组//////////
NSArray *arrayM = @[@"1",@"2",@"3",@"4"];
for (id obj in arrayM) {
NSLog(@"%@",obj);
}
    //////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];
for (id obj in [arrayM2 reverseObjectEnumerator]) {
NSLog(@"%@",obj);
}
}

  优点:1)语法简洁;2)效率最高;

  缺点:无法获得当前遍历操作所针对的下标

四、基于Block的遍历方式

  基于Block的方式来进行遍历是最新引入的方法。它提供了遍历数组字典等类型数据的最佳实践。示例如下:

  //基于块(block)的遍历方式
-(void)iteratorWithBlock
{
//////////处理数组//////////
NSArray *arrayM = @[@"1",@"2",@"3",@"4"];
[arrayM enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%zd--%@",idx,obj);
}];
    //////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];
[arrayM2 enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%zd--%@",idx,obj);
}];
}

  优点: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)无法实现反向遍历。

 
 
 
 
 
 
 

7、Objective-C中的各种遍历(迭代)方式的更多相关文章

  1. iOS 学习 - 6.Objective-C中的各种遍历(迭代)方式

    说明:转自文顶顶 一.使用 for 循环 要遍历字典.数组或者是集合,for 循环是最简单也用的比较多的方法 -(void)iteratorWithFor { //////////处理数组////// ...

  2. java中对HashMap遍历的方式

    第一种是利用HashMap的entrySet()方法: Map<String,String> map = new HashMap<String,String>(); Itera ...

  3. iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

    iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...

  4. ios-Objective-C中的各种遍历(迭代)方式(转载)

    iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...

  5. 细说java中Map的两种迭代方式

    曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...

  6. Opencv中图像的遍历与像素操作

    Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0 ...

  7. Java中map接口 遍历map

    转自:https://www.cnblogs.com/wjk921/p/4918442.html java集合框架用于存储数据,也被称为集合类 位于java.util包下 java.util包下常用接 ...

  8. c++ 二叉树的遍历(迭代,递归)

    #include<iostream> #include <algorithm> #include <vector> #include <set> #in ...

  9. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  10. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

随机推荐

  1. 物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了。

    物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了.   步骤如下: 一.反向生成物理数据模型PDM 开发环境 PowerDes ...

  2. ASP.NET MVC C#知识点提要

    ASP.NET MVC C#知识点提要 本篇博文主要对asp.net mvc开发需要撑握的C#语言知识点进行简单回顾,尤其是C# 3.0才有的一些C#语言特性.对于正在学asp.net mvc的童鞋, ...

  3. JS左侧菜单-04

    <script language="javascript" type="text/javascript"> function HideShow() ...

  4. linuxmint 15/ ubuntu 13.04 install OpenERP client 6.0.4

    As we all know OpenERP is a great open-source ERP/CRM project. It does help people a lot when workin ...

  5. 记一次修复被篡改的IE首页

    今天开电脑,打开IE发现首页被篡改为http://www.you2000.cn/,下意识是恶意插件造成的,可是为什么金山卫士没发现呢(我电脑上只装了一个金山卫士)?我锁定首页的啊... 只好手动运行金 ...

  6. 1.JSP入门

    一.JSP基础 1.JSP概述 JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据. JSP = html + Jsp脚 ...

  7. 说说Request.Params[key]和Request[key]

    摘要 其实你一看到,就应该会想到,这个不简单吗,不就是服务端接收参数的一种方式吗?是的.在asp.net编程中,QueryString.Form.Cookie是三种比较常见的接收客户端参数的方式.Qu ...

  8. Node.js学习笔记(二):模块

    模块是 Node.js 应用程序的基本组成部分,文件和模块是一一对应的.一个 Node.js 文件就是一个模块,这个文件可能是 JavaScript 代码.JSON 或者编译过的 C/C++ 扩展. ...

  9. c#-委托,匿名方法,lambda表达的关系

    什么是委托: 包含单个方法的委托和函数指针是相似的,不同的是,委托是面向帝乡的并且是类型安全的 声明委托类型: delegate void mydel(int x); 声明委托和声明方法差不多,两个不 ...

  10. Grant简介以及安装

    Grant简介以及安装 1.   安装Grunt-cli需要使用npm,全局安装  命令:npm install –g grunt-cli(可能会涉及权限问题) 注意,安装grunt-cli并不等于安 ...