行业动态
基于C语言的for循环遍历字典--Objective-C内存总结
2021-01-23

Objective-C基于C语言,因此自然可以使用for循环

遍历数组:

NSArray *IOSArray = @ [@“ L”,@“ O”,@“ V”,@“ E”,@“ I”,@“ O”,@“ S”];

for(int i = 0; i

//处理数组中的数据

NSLog(@“%@”,IOSArray [i]);

}

遍历数组很容易,没问题,让我们遍历字典。

遍历字典:

NSDictionary * dict = @ {@“ 1”:@“ 11”,@“ 2”:@“ 22”,@“ 3”:@“ 33”};

NSArray * keysArray = [dict allKeys];

for(int i = 0; i

//根据键值处理字典中的每个项目

NSString * key = keysArray [i];

NSString * value = dict [key];

NSLog(@“%@”,值);

}

我们知道字典和集合是无序的,因此我们无法基于特定的整数下标直接访问它们的值,因此我们需要首先获取字典中的键或集合中的所有对象,以便我们可以让它们遍历有序数组。但是,创建数组需要额外的开销,并且将创建一个额外的数组对象。它将所有对象保留在集合中并占用内存。

优缺点摘要:

优点:用途广泛,易于接受,操作简单;

缺点:遍历字典和集合比较麻烦,这将占用更多的系统资源。

第二种方式:NSEnumerator

ios 遍历dictionary_遍历dictionary_ios dictionary遍历

NSEnumerator是一个抽象基类ios 遍历dictionary,它定义了两种实现子类的方法:

-(可空的ObjectType)nextObject;

@属性(只读,副本)NSArray * allObjects;

nextObject是键方法,它返回枚举中的下一个对象。每次调用该方法时,其内部结构都会更新,以便下次调用该方法时可以返回下一个对象。返回枚举中的所有对象后,调用将返回nil,表示已到达枚举的结尾。

Foundation框架中的集合都实现了这种遍历方法,例如:

NSArray *IOSArray = @ [@“ L”,@“ O”,@“ V”,@“ E”,@“ I”,@“ O”,@“ S”];

NSEnumerator *枚举数= [IOSArray objectEnumerator]; //向前遍历

NSEnumerator *枚举数= [IOSArray reverseObjectEnumerator]; //反向遍历

id对象;

while(((object = [enumerator nextObject])!= nil){

//处理枚举器中的数据

NSLog(@“%@”,object);

}

字典和集合的实现类似,不同之处在于字典中有键和值,应根据具体的键取值。它还提供了正向遍历和反向遍历。

优缺点摘要:

优点:代码更易于阅读,无需定义其他数组;

缺点:1、无法直接获得遍历操作的下标,并且需要额外声明变量记录;

2、需要自己创建NSEnumerator对象,这有点麻烦。

第三种方式:快速遍历

Objective-C2.0引入了快速遍历的功能。快速遍历类似于NSEnumerator,但是语法更加简洁。它为for循环打开in关键字,从而简化了遍历集合所需的语法,例如遍历数组:

遍历dictionary_ios 遍历dictionary_ios dictionary遍历

NSArray *IOSArray = @ [@“ L”,@“ O”,@“ V”,@“ E”,@“ I”,@“ O”,@“ S”];

for(IOSArray中的NSString * obj){

//处理数组中的数据

NSLog(@“%@”,obj);

}

遍历字典同样容易:

NSDictionary * dict = @ {@“ 1”:@“ 11”,@“ 2”:@“ 22”,@“ 3”:@“ 33”};

用于(NSString * dict中的键){

//处理字典键

NSString * value = dict [key];

NSLog(@“%@”,值);

}

反向遍历可以用于([IOSArray reverseObjectEnumerator]中的NSString * obj)

优缺点摘要:

优点:语法简单,易于使用,效率高;

缺点:1、无法轻松获得当前的遍历下标;

2、在遍历过程中不能修改遍历的集合,否则会导致崩溃。

第四种方式:基于块的遍历

这是本文的重点,也是我强烈推荐的方法。苹果已经封装了如此高效,优雅且易于使用的界面集,而没有太多浪费。

遍历数组:

NSArray *IOSArray = @ [@“ L”,@“ O”,@“ V”,@“ E”,@“ I”,@“ O”,@“ S”];

[IOSArray enumerateObjectsUsingBlock:^(id _Nonnull obj,NSUInteger idx,BOOL * _Nonnull stop){

NSLog(@“%@”,obj);

if([obj isEqualToString:@“ E”]){

*停止=是;

}

}];

参数说明:obj表示数组中的元素,idx表示元素的下标,* stop可以控制遍历何时停止,只需在需要停止时设置* stop = YES(不要忘记前面的*)。

此方法清晰明了。数组元素和下标可以直接获得。很容易实现何时停止,可以取消折断以及遍历字典的操作同样简单。

遍历字典:

NSDictionary * dict = @ {@“ 1”:@“ 11”ios 遍历dictionary,@“ 2”:@“ 22”,@“ 3”:@“ 33”};

[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull键,id _Nonnull obj,BOOL * _Nonnull停止){

NSLog(@“%@”,obj);

if([obj isEqualToString:@“ 22”]){

*停止=是;

}

}];

您没看错,就这么简单。该块直接为我们提供了字典的键和值,无需编写简单直接的代码。

注意:

如果已知集合中对象的数据类型,则可以修改块签名。在指定了对象的精确类型之后,编译器可以检测开发人员是否调用了该对象没有的方法,并在发现问题时报告错误。

遍历dictionary_ios dictionary遍历_ios 遍历dictionary

NSDictionary * dict = @ {@“ 1”:@“ 11”,@“ 2”:@“ 22”,@“ 3”:@“ 33”};

[dict enumerateKeysAndObjectsUsingBlock:^(NSString * key,NSString * obj,BOOL * _Nonnull stop){

NSLog(@“%@”,obj);

if([obj isEqualToString:@“ 22”]){

*停止=是;

}

}];

对于代码,直接将键和值类型修改为NSString类型。

反向遍历:

反向遍历也很方便,只需调用另一个方法即可

NSArray *IOSArray = @ [@“ L”,@“ O”,@“ V”,@“ E”,@“ I”,@“ O”,@“ S”];

[IOSArray enumerateObjectsWithOptions:NSEnumerationReverseusingBlock:^(NSString * obj,NSUInteger idx,BOOL * _Nonnull stop){

NSLog(@“%@”,obj);

if([obj isEqualToString:@“ E”]){

*停止=是;

}

}];

与正向遍历相比,此方法还有一个枚举类型参数NSEnumerationReverse。启用此选项以启用反向遍历。

并发遍历:

遵循此枚举类型的参数将导致块枚举的另一个大优点:并发遍历。参数为:NSEnumerationConcurrent,这意味着可以同时遍历集合中的几个元素。具体数目取决于系统资源。组。这将充分利用系统资源,并高效快速地完成收集遍历。系统的底层将通过GCD处理并发问题。开发人员无需担心内存和线程。以其他方式很难实现有效的并发遍历。通过块枚举,更改集合不会导致崩溃,代码如下:

NSArray *IOSArray = @ [@“ L”,@“ O”,@“ V”,@“ E”,@“ I”,@“ O”,@“ S”];

NSMutableArray *IOSMutableArray = [NSMutableArray arrayWithArray:IOSArray];

[IOSMutableArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString * obj,NSUInteger idx,BOOL * _Nonnull stop){

obj = [NSString stringWithFormat:@“ _%@”,obj];

[IOSMutableArray replaceObjectAtIndex:idx withObject:obj];

NSLog(@“%@”,obj);

if([obj isEqualToString:@“ _ I”]){

*停止=是;

}

}];

优缺点摘要:

优点:

1、可以完美实现for循环的所有功能;

2、可以轻松获取集合中的每个元素;

3、提供循环遍历的参数,而NSEnumerationReverse用于实现反向循环。 NSEnumerationConcurrent用于实现并发遍历,可以同时使用两个参数;

4、此循环方法非常高效,可以提高程序性能。开发人员可以专注于业务逻辑,而不必担心内存和线程问题;

5、当NSEnumerationConcurrent选项打开时,可以实现并发循环功能,这些功能无法通过for循环轻松实现,并且无法快速遍历。系统的底层将通过GCD处理并发问题,从而可以充分利用系统和硬件资源来实现最佳的遍历效果;

6、可以修改块签名。弄清楚集合中的元素类型后,可以将默认签名ID类型修改为已知类型,例如通用NSString,这样可以节省系统资源开销,还可以通过以下方法防止向对象发送不存在的信息:错误是导致崩溃。

缺点:

1、许多开发人员都不知道这种遍历方法;

2、在此处使用块,您需要注意在块中容易引起的保留循环问题。例如,当使用self调用方法时,将self转换为引用可能会破坏保留循环。例如:__weak __typeof(self)weakSelf = self或__weak MyController * weakSelf = self;在代码块中使用weakSelf。


393701618