Block学习

2017-03-16  本文已影响0人  Zz橙淞

Block

};
调用Block保存的代码
block变量名(实参);

 //(2)定义名为myBlock的代码块,返回值类型为int
int mutiplier = 7;
int (^myBlock)(int) = ^(int num){
    return num*mutiplier;
};
//使用定义的myBlock
int newMutiplier = myBlock(3);
printf("newMutiplier is %d",myBlock(3));

__block关键字的引用

//将Block定义在方法内部
//作为变量
此时myBlock可作为变量自由传递, 调用的时候myBlock(10, 20);即可.
int (^myBlock) (int a, int b) = ^int (int a, int b) {
return a - b;
};
int dum = myBlock(10, 20);
NSLog(@"%d",dum);
-------------------------------------------------------
如果想在block中对当前局部变量进行修改的话, 需要使用__block,如下:
__block int x = 100;
void (^sumXAndYBlock)(int) = ^(int y){
x = x + y;
printf("改变后X的值 %d",x);
};
sumXAndYBlock(50);

如果不用__block修饰Xcode会提示x变量错误信息:Variable is not assigning (missing __block type)


屏幕快照 2017-03-17 上午9.29.35.png

-------------------------------------------------------
__block int mul = 0;
int (^MulBlock)(int a, int b) = ^int (int a, int b) {
mul = a * b;
return mul;
};

      MulBlock(10,10);
      NSLog(@"%d", mul);

block默认可访问局部变量mul, 而不能修改, 以防出现循环引用的情况.
而__block对象在block中不会被其强引用一次, 所以不会出现循环引用.
所以说如果在Block的{}体内,修改外部变量就需要用__block修饰。

__block和

__weak

以上可知, 声明block的时候只是把该sum局部变量复制了一份, 因此若其是一个指针, 则在block中修改其指向的内容不需要加__block.
__block修饰对象和基本数据类型, 而__weak只能修饰对象.
__block对象可在block中修改(重新赋值), 而__weak不行.因此, 对于类的对象, 若要在block中对其属性进行修改, 需要使用__weak.代码如下:

定义两个属性
 @interface ViewController ()

  @property(nonatomic,copy)void (^myBlock2)(NSInteger);
  @property(nonatomic,assign)NSInteger count;

  @end

  //block修改值
- (void)viewDidLoad {
      [super viewDidLoad];
      self.view.backgroundColor = [UIColor whiteColor];
       __weak typeof(self) weakself = self;
       _myBlock2 = ^(NSInteger count) {
       weakself.count = count;
       NSLog(@"%ld",weakself.count);
    };
      _myBlock2(10);
}

如果不用__weak修饰则会出现如下情况

屏幕快照 2017-03-17 上午10.14.09.png

block传值

上一篇 下一篇

猜你喜欢

热点阅读