^是Block的特有标记
Block的实现代码包含在{}之间
例如:
格式说明:
(返回类型)(^块名称)(参数类型) = ^(参数列表) {代码实现};
如果没有参数,等号后面参数列表的()可以省略
在定义Block时,会在Block中建立当前局部变量内容的副本(拷贝)
后续再对该变量的数值进行修改,不会影响Block中的数值
如果需要在block中保持局部变量的数值变化,需要使用__block关键字
使用__block关键字后,同样可以在Block中修改该变量的数值
在被当做参数传递时,Block同样可以使用在定义之前声明的局部变量
默认情况下,Block外部的变量,在Block中是只读的!
如果要修改Block之外的局部变量,需要使用__block关键字
使用时,避免block对指针做强引用,从而引起内存不能释放问题。
可以使用typedef定义一个Block的类型,便于在后续直接使用。
Block是一种数据类型,那么可以将Block当做比较特殊的对象。
局部变量默认都是强引用的,离开其所在的作用域之后就会被释放
使用__weak关键字,可以将局部变量声明为弱引用
Block的实现代码包含在{}之间
大多情况下,以内联inline函数的方式被定义和使用
系统中有自带的inlineblock, Xcode里直接敲就会出现block
例如:
void(^demoBlock)() = ^ {
NSLog(@"demo Block");
};
int(^sumBlock)(int, int) = ^(int x, int y) {
return x + y;
};
格式说明:
(返回类型)(^块名称)(参数类型) = ^(参数列表) {代码实现};
如果没有参数,等号后面参数列表的()可以省略
在定义Block时,会在Block中建立当前局部变量内容的副本(拷贝)
后续再对该变量的数值进行修改,不会影响Block中的数值
如果需要在block中保持局部变量的数值变化,需要使用__block关键字
使用__block关键字后,同样可以在Block中修改该变量的数值
在被当做参数传递时,Block同样可以使用在定义之前声明的局部变量
默认情况下,Block外部的变量,在Block中是只读的!
如果要修改Block之外的局部变量,需要使用__block关键字
使用时,避免block对指针做强引用,从而引起内存不能释放问题。
可以使用typedef定义一个Block的类型,便于在后续直接使用。
Block是一种数据类型,那么可以将Block当做比较特殊的对象。
局部变量默认都是强引用的,离开其所在的作用域之后就会被释放
使用__weak关键字,可以将局部变量声明为弱引用
block 定义属性值,使用copy
@property (nonatomic, copy) BLOCKHANDLE finishBlock;
- (void)demoBlockOp
{
// 不能用__weak
// __weak DemoObj *weakSelf = self;
// 只有self直接强引用block,才会出现循环引用
// block的管理以及线程的创建和销毁是由队列负责的,直接在block中使用self没有关系!
for (int i = 0; i < 10; ++i) {
[self.queue addOperationWithBlock:^{
//不能使用__weak
// [weakSelf demoOp:@(i)];
[self demoOp:@(i)];
}];
}
}