iOS之block

2017-01-13  本文已影响0人  FongG

什么是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

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

上一篇下一篇

猜你喜欢

热点阅读