iOS中|iOS中 BOOL *stop在enumerateObjectsUsingBlock为什么这样写和使用。(联想到了break,return,continue的区别)
1.首先先看
[arr enumerateObjectsUsingBlock:^(id_Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {}];
BOOL * stop 系统为什么这么写呢,平时我们都是这么写BOOL stop ,简单说一下,这就涉及到了引用传递和值传递,BOOL是基本数据类型, 不传地址就是值传递 相当于传递了一个副本, 也就修改不了外面的值,* stop属于引用传递,传递的是地址,可以修改外面的值。楼主也就理解到这。
在使用enumerateObjectsUsingBlock遍历的时候,怎样跳出循环?有的同学说 * stop = YES;
有的同学说 return; 先看一下代码:
1.* stop=YES;
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
[arr enumerateObjectsUsingBlock:^(id_Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"Before obj = %@", obj);
if ([obj isEqualToString:@"3"]) {
*stop = YES;
}
NSLog(@"After obj = %@", obj);
}];
打印结果:
2020-06-17 10:22:23.424020+0800 PhotoAndVideo[18095:246340] Beforeobj = 1
2020-06-17 10:22:23.424187+0800 PhotoAndVideo[18095:246340] After obj = 1
2020-06-17 10:22:23.424312+0800 PhotoAndVideo[18095:246340] Beforeobj = 2
2020-06-17 10:22:23.424421+0800 PhotoAndVideo[18095:246340] Afterobj = 2
2020-06-17 10:22:23.424540+0800 PhotoAndVideo[18095:246340] Before obj = 3
2020-06-17 10:22:23.424635+0800 PhotoAndVideo[18095:246340] Afterobj = 3
也就是说到*stop=YES执行的时候,跳出循环block,但本次循环会执行完成。
2.return;
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
[arr enumerateObjectsUsingBlock:^(id_Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"Before obj = %@", obj);
if ([obj isEqualToString:@"3"]) {
// *stop = YES;
return;
}
NSLog(@"Afterobj = %@", obj);
}];
打印结果:
2020-06-17 10:25:27.599214+0800 PhotoAndVideo[18134:249742] Before obj = 1
2020-06-17 10:25:27.599369+0800 PhotoAndVideo[18134:249742] Afterobj = 1
2020-06-17 10:25:27.599461+0800 PhotoAndVideo[18134:249742] Before obj = 2
2020-06-17 10:25:27.599541+0800 PhotoAndVideo[18134:249742] Afterobj = 2
2020-06-17 10:25:27.599623+0800 PhotoAndVideo[18134:249742] Before obj = 3
2020-06-17 10:25:27.599699+0800 PhotoAndVideo[18134:249742] Before obj = 4
2020-06-17 10:25:27.599774+0800 PhotoAndVideo[18134:249742] Afterobj = 4
2020-06-17 10:25:27.599853+0800 PhotoAndVideo[18134:249742] Before obj = 5
2020-06-17 10:25:27.599936+0800 PhotoAndVideo[18134:249742] Afterobj = 5
打印结果似曾相似,好像在哪见过。当值为3的时候,会跳出当前循环block,下面的继续执行。
3.看下它两一起使用
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
[arr enumerateObjectsUsingBlock:^(id_Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"Before obj = %@", obj);
if ([obj isEqualToString:@"3"]) {
*stop = YES;
return;
}
NSLog(@"Afterobj = %@", obj);
}];
打印结果:
2020-06-17 10:30:42.393890+0800 PhotoAndVideo[18165:253337] Before obj = 1
2020-06-17 10:30:42.394081+0800 PhotoAndVideo[18165:253337] Afterobj = 1
2020-06-17 10:30:42.394233+0800 PhotoAndVideo[18165:253337] Before obj = 2
2020-06-17 10:30:42.394327+0800 PhotoAndVideo[18165:253337] Afterobj = 2
2020-06-17 10:30:42.394408+0800 PhotoAndVideo[18165:253337] Before obj = 3
打印记过也是似曾相识,一起用的时候,跳出当前循环,不会执行后面的代码。
总结:
*stop = YES;
跳出循环Block,但是本次循环需要执行完成。
return;
跳出本次循环Block,相当于for循环中continue的用法。
*stop = YES;
和 return;
连用,跳出循环Block,不执行本次循环剩余的代码,相当于for循环中break的用法。
研究这个过程中,突然想到了break,return,continue,就一起再写下来吧,虽然都是基础知识,好记性不如烂笔头。
1.break
for (int i = 0;
i<4;
i++) {NSLog(@"当前i的值是:%d",i);
if (i == 2 ) {//执行该语句时结束循环
break;
//continue;
//return 0;
}
NSLog(@"dd");
}
2.return
for (int i = 0;
i<4;
i++) {NSLog(@"当前i的值是:%d",i);
if (i == 2 ) {//执行该语句时结束循环
//break;
//continue;
return 0;
}
NSLog(@"dd");
}
3.continue
for (int i = 0;
i<4;
i++) {NSLog(@"当前i的值是:%d",i);
if (i == 2 ) {//执行该语句时结束循环
//break;
continue;
//return 0;
}
NSLog(@"dd");
}
打印结果大家应该可以知道吧,不卖关子了 ,看下打印结果,按上面的方法执行打印的结果:
break
2020-06-17 10:38:50.972523+0800 PhotoAndVideo[18221:258557] 当前i的值是:0
2020-06-17 10:38:50.972711+0800 PhotoAndVideo[18221:258557] dd
2020-06-17 10:38:50.972842+0800 PhotoAndVideo[18221:258557] 当前i的值是:1
2020-06-17 10:38:50.972956+0800 PhotoAndVideo[18221:258557] dd
2020-06-17 10:38:50.973127+0800 PhotoAndVideo[18221:258557] 当前i的值是:2
return
2020-06-17 10:38:50.972523+0800 PhotoAndVideo[18221:258557] 当前i的值是:0
2020-06-17 10:38:50.972711+0800 PhotoAndVideo[18221:258557] dd
2020-06-17 10:38:50.972842+0800 PhotoAndVideo[18221:258557] 当前i的值是:1
2020-06-17 10:38:50.972956+0800 PhotoAndVideo[18221:258557] dd
2020-06-17 10:38:50.973127+0800 PhotoAndVideo[18221:258557] 当前i的值是:2
在这里虽然break和return虽然打印一样,但是不要搞混了,break用于完全结束一个循环,跳出循环体,不管是那种循环,一旦在循环体中遇到break,系统将完全结束该循环,开始执行循环后边的代码。而return并不是专门用于结束循环结构的关键字眼,return是直接结束整个函数,不管这个return处于多少层循环之内。
continue
2020-06-17 10:42:54.867951+0800 PhotoAndVideo[18276:261691] 当前i的值是:0
2020-06-17 10:42:54.868123+0800 PhotoAndVideo[18276:261691] dd
2020-06-17 10:42:54.868265+0800 PhotoAndVideo[18276:261691] 当前i的值是:1
2020-06-17 10:42:54.868396+0800 PhotoAndVideo[18276:261691] dd
2020-06-17 10:42:54.868502+0800 PhotoAndVideo[18276:261691] 当前i的值是:2
2020-06-17 10:42:54.868595+0800 PhotoAndVideo[18276:261691] 当前i的值是:3
2020-06-17 10:42:54.868678+0800 PhotoAndVideo[18276:261691] dd
continue比较明显,符合条件时当前不执行,继续执行。
总结:
break用于完全结束一个循环,跳出循环体,不管是那种循环,一旦在循环体中遇到break,系统将完全结束该循环,开始执行循环后边的代码。return并不是专门用于结束循环结构的关键字眼,return是直接结束整个函数,不管这个return处于多少层循环之内。continue 当前不执行 下面继续执行。
【iOS中|iOS中 BOOL *stop在enumerateObjectsUsingBlock为什么这样写和使用。(联想到了break,return,continue的区别)】希望对大家有所帮助吧,菜鸡一个,一起努力。
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理