Block:
与函数指针的比较:
有点像函数指针,可以作为参数传递,作为函数返回值
函数指针:
Void (*mypoint)()=test;
mypoint();
block弥补了 指向函数的指针不能够直接保存一个函数体
void (^myBlock)()=^{
}
(1)定义BLOCK变量
Int (^SumBlock)(int,int);//有参数,返回值类型为int
Void (^MyBlock)();//无参数,返回值类型为空
(2)利用block封装代码
(3)Block访问外部变量
1)Block内部可以访问外部变量;
2)默认情况下,Block内部不能修改外部的局部变量
3)给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。
(4)利用typedef定义block类型(和指向函数的指针很像)
Typedef int(^MyBlock)(int ,int);
1)定义block变量:
MyBlock a,b;
a=^(int a,int b){return a-b;};
MyBlock b2=^(int n1,int n2){return n1*n2;}
2)作为参数传递:
-(int)calculateWithNumber1:(int)number1 andNumber2:(int)number2
andCalculateBlock:(MyBlock )calculate
{
}
(3)作为属性:
@property (nonatomic, copy) void (^testBlock)();
// 1.如果没有对block进行copy操作,block就存储于栈空间
// 2.如果对block进行copy操作,block就存储于堆空间
// 3.如果block存储于栈空间,不会对block内部所用到的对象产生强引用
// 4.如果block存储于堆空间,就会对block内部所用到的对象产生强引用
LPerson *p =[[LPerson alloc] init];
//解决办法:
_weak typeof (p) weakP = p;
p.testBlock = ^{
[p run]
}
非ARC:
__block typeof(p) weakP = p;
// p.testBlock = ^{
// [weakP run];
// };
即:
Block的使用注意:
1> block的内存管理
2> 防止循环retian
l 非ARC(MRC):__block
l ARC:__weak\__unsafe_unretained
int age = 10;
void (^block)() = ^{ // 值捕获
NSLog(@"age=%d", age);
};
age = 20;
打印10. __block int age = 10;(可以在block改值,动态取age的值,相当于NSLog(@"age=%d",*&(age)),传的是地址) 打印20 static int age = 10; 打印20