iOS经验总结

iOS中 BOOL *stop在enumerateObjects

2020-06-17  本文已影响0人  其实你懂De

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] Before  obj = 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] Before  obj = 2
2020-06-17 10:22:23.424421+0800 PhotoAndVideo[18095:246340] After  obj = 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] After  obj = 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(@"After  obj = %@", 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] After  obj = 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] After  obj = 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] After  obj = 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] After  obj = 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(@"After  obj = %@", 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] After  obj = 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] After  obj = 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 当前不执行 下面继续执行。

希望对大家有所帮助吧,菜鸡一个,一起努力。

上一篇下一篇

猜你喜欢

热点阅读