1.0 基本使用
//声明 一个block,
//返回类型是NSString
//block名称:myBlock
//参数类型:int
NSString *(^myBlock)(int);
//定义 一个block
//即调用block需要执行的代码
myBlock=^(int number){
return [NSString stringWithFormat:@"%d",number];
};
//block的调用
myBlock(2);
2.0 block的闭包
//声明block,不带参数的
int (^sumBlock)(void);
//定义并出示化两个变量
int a=3,b=5;
//定义block
sumBlock = ^(void){
//可以使用block函数外的变量
return a+b;
};
a=5;
b=10;
//在这里调用block时,block中的回调函数中的a,b的值依然是a=3,b=5
//因为在定义block时,就已经将a,b变量copy了
//所以block中的回调函数跟后面的a、b已经是没有关联的
//还有就是block回调函数中copy的a、b变量都是只读的
//已经是说不能在block中修改a、b的值
NSLog(@"%d",sumBlock());
//输出结果是:8;
//【重点】如果有时候确实需要在block中修改变量时的处理方法
/*
解决方法:
对在block中需要更改的变量中,如a和b,
在变量的声明前添加一个修饰符:“__block”,这样block
回调就不是copy a、b变量了,而是复制其引用地址来
实现访问的,即建立起关联,只要在调用block前,变量的
修改了,那么在block中的变量响应也被修改了,并且可以在
block中修改变量的值,如a、b
*/
__block int c =3,d=5;
int (^reduce)();
reduce = ^(void){
return d-c;
};
c = 4;
d = 8;
NSLog(@"====%d",reduce());
//输出结果:-4;
3.0 block作为参数传递
-(void)testBlock:(NSString *(^)(int))myBlcok
{
}
4.0 typedef 与 block
typedef void(^Myblock)();
@interface ViewController ()
@property (nonatomic,copy) Myblock block;
@end
循环引用分析
小编暂时还没有这个能力分析,但是这里分享一遍博客天口三水羊 ,博主分析的很透彻,但浅显易懂,看完都收益良多,极力推荐各位细细阅读!!!
网友评论