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, 最好能够思考一下,不要造成循环引用
相关文章推荐
- [转载]两个未公开的ACCESS方法的使用技巧
- [导入]数据集的使用方法和技巧
- 【性能技巧】使用DataReader[列序号]的方法读取DataReader对象
- Javascript中的Split使用方法与技巧
- JavaScript的方法技巧和使用
- JS中的正则表达式小小的技巧---Test方法的使用
- 深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
- 两个未公开的ACCESS方法的使用技巧
- 深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
- JavaScript使用方法和技巧(二)
- 总结:ADO.NET在开发中的部分使用方法和技巧
- kshen转总结:ADO.NET在开发中的部分使用方法和技巧
- WGET的使用方法与技巧
- 两个未公开的ACCESS方法的使用技巧
- 技巧:ArrayList的使用方法(转)
- google使用方法及技巧
- 总结:ADO.NET在开发中的部分使用方法和技巧 选择自 yangyifan0 的 Blog
- 数据集的使用方法和技巧
- 数据集的使用方法和技巧
- JavaScript使用方法和技巧(三)