美文网首页
iOS之block

iOS之block

作者: FongG | 来源:发表于2017-01-13 17:42 被阅读0次

    什么是block?

    <b>一句话概括:block是带有自动变量的匿名函数</b>, 与汗水指针类似,我们使用block变量来指向一个block对象

    
    声明--------
    
    返回值类型 (^ block变量名称)(参数)
    
    int (^blockName)(int count);
    或者
    typedef void(^blockName)(NSError *error);
    
    blockName = ^() (int count){
      return count + 1;
    }
    声明一个blockName变量,由”^“开始的block语法赋值给变量blockName
    
    Stephen Blaha对typedef用法做过一个总结:“建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头”。
    
    
    实现-----------
    语法:^ 返回值类型 参数列表  表达式
    
    如:
     ^ int (int count) { return  count + 1;}   
    等价于 ^ (int count) { return  count + 1;}
    
    

    1. block表达式会截获使用的自动变量的值,是瞬间的值。
    
    
    - (void)test{
      
     int a = 10;
    void (^block) = {printf(a);} //截获值 a = 10
    
    a += 10;
    block();
    
    //打印结果 10
    }
    
    
    1. block 中只能访问变量,不能修改,但可以使用__block修饰

    如果是在类的block回调中,可以使用self

        [UIView animateWithDuration:0.5 animations:^{
            self.tableView.alpha = 0.5;
        }];
    


    </br>

    如果是在类的一个属性,持有了某个block,则block中不能使用self,需要用weak self对象

    self.tableView.mj_header = [BaseNormalHeader headerWithRefreshingBlock:^{
            weakSelf.tableView.alpha = 0.5;
          //调用方法,方法里面可以使用self
             [weakSelf  updateUI]
    }];
    
    
    -(void)updateInfo{
        kWeakSelf
        [self.viewModel refreshPerosnInfoMemberId:self.merberID success:^(BaseObjectState *obj) {
            weakSelf.tableView.alpha = 1;
            }
        } faliure:^(NSError *error) {
        }];
    }
    
    

    17/12/13 更新

    将概念置于情景中处理。
    B -> block_B -> block_B -> B

    所以归结起来只要切断上面链路中任意一个持有关系,就可以达到避免循环引用的作用

    相关文章

      网友评论

          本文标题:iOS之block

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