美文网首页iOS经验总结
iOS中 BOOL *stop在enumerateObjects

iOS中 BOOL *stop在enumerateObjects

作者: 其实你懂De | 来源:发表于2020-06-17 10:46 被阅读0次

    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 当前不执行 下面继续执行。
    

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

    相关文章

      网友评论

        本文标题:iOS中 BOOL *stop在enumerateObjects

        本文链接:https://www.haomeiwen.com/subject/zpyjxktx.html