block

block

(返回值类型)(^块名字)(参数类型) = ^(参数列表){代码实现};

block 是一种特殊的数据类型,可以将 block 当做比较特殊的对象

使用局部变量

block 可以使用在定义之前声明的局部变量(默认的情况下是只读的)

int i = 10;

void (^myblock)() = ^{

    NSLog("%d",i);

};

i = 100;

myblock();

输出结果是 10 

注意:

1 在定义 block 时 ,会在 block 中建立  当前局部变量内容的副本(拷贝), block 中所用的也就是这个副本

2 后续在对该变量的的任何修改,都不会影响 block 中的这个变量的数值

3 如果需要在 block 中保持局部变量的数值变化,需要使用__ block 关键字

4 使用__block 关键字之后,同样可以再 block 中修改变量数值

传递对象

注意循环引用

@property (nonatomic, strong) NSMutableArray *myBlocks;




#pragma mark 将代码改为调用self的方法


int(^sum)(int, int) = ^(int x, int y) {


    return [self sum:x y:y];


};


[self.myBlocks addObject:sum];




#pragma mark 对象被释放时自动调用


- (void)dealloc


{


    NSLog(@"DemoObj被释放");


}


self 对 myblocks 强引用 myblock 对sum 强引用 sum 对 self 强引用 产生循环引用的结果就是对象无法释放,由于局部变量默认的都是强引用,离开其所在的作用区域后都会被释放.所以使用__ weak关键字,将局部变量声明为弱引用

__weak DemoObj *weakSelf = self;

int (^int,int) = ^(int,int){

    return [weakSelf sum:x y:y];

};

所以在 block 内部,如果碰到 self, 最好能够思考一下,不要造成循环引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值