您的位置:首页 > 移动开发 > IOS开发

block块的使用方法与技巧

2015-03-12 19:21 169 查看

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, 最好能够思考一下,不要造成循环引用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios block块使用