首先来了解下什么是Block
-
(1)Block是OC中的一种数据类型,在iOS开发中被广泛使用
(2)^是Block的特有标记
(3)Block的实现代码包含在{}之间
(4)大多情况下,以内联inline函数的方式被定义和使用
(5)Block与C语言的函数指针有些相似,但使用起来更加灵活
-
示例:
void(^demoBlock)() =^ {
NSLog(@"Block");
// 无参数,无返回值
};
int(^sumBlock)(int, int) =^(int x, int y) {
return x +y;
// 有参数有返回值
};
-
格式说明:(返回类型)(^块名称)(参数类型) = ^(参数列表) {代码实现};
如果没有参数,等号后面参数列表的()可以省略
-
注意事项:
1、Block可以使用在定义之前声明的变量
int i = 10;
void (^myBlock) () = ^{
NSLog(@"%d",i);
}
i = 100;
myBlock();
- 注意:
1、在定义Block时,会在Block中建立当前局部变量内容的副本【也就是拷贝】。
2、后续再对该变量的数值修改,不会影响Block中的值,所以上述代码执行结果是10.
3、如果想要在Block中保持局部数值的变化,需要用到__block
关键字
__block int i = 10;
void (^myBlock) () = ^{
NSLog(@"%d",i);
}
i = 100;
myBlock();
Block的使用要点
1、Block可以被当做参数直接传递,在被当做参数传递时,Block同样可以使用在定义之前声明的局部变量
- 注意:默认情况下,Block外部的变量,在Block中是只读的!
2、如果要修改Block之外的局部变量,需要使用__block
关键字,一般用不到__block
关键字,在块代码中可以修改成员变量的数值(比较少用)
3、当把一个对象传递进Block的时Block会自动对对象的指针做强引用
4、用typedef定义一个Block的类型,便于在后续直接使用
typedef double(^MyBlock)(double, double);
// 下边直接用定义的名字写起来简短许多
MyBlock area = ^(double x, double y) {
return x * y;
};
MyBlock sum = ^(double a, double b) {
return a + b;
};
(1)typedef是关键字用于定义类型,MyBlock是定义的Block类型
(2)area、sum分别是MyBlock类型的两个Block变量尽管,typedef可以简化Block的定义,但在实际开发中并不会频繁使用typedef关键字
这是因为Block具有非常强的灵活性,尤其在以参数传递时,使用Block的目的就是为了立即使用
- 关于Block的循环引用问题
@property (nonatomic,strong)NSMutableArray * myBlocks;
#pragma mark
int (^sum)(int ,int) = ^(int x,int y){
return [self sum:x y:y];
};
[self.myBlocks addObject:sum];

-
解决循环引用的办法
代码导图.jpg
- 下一篇文章将介绍如何把按钮的点击事件用Block传递出去
网友评论