1.block声明
返回类型(^block名字)(参数列表)
int(^MyBlock)(int a,int b);
2.block赋值
block变量=^(参数类型){函数体};
MyBlock = ^(int a,int b){
return a+b;
};
3.声明时同时赋值
int(^SomeBlock)(inta,intb) = ^(inta ,intb)
{
returna+b;
};
4.block变量的调用
SomeBlock(6,7);
int b = MyBlock(3,4);
使用typedef定义block
typedef void(^defBlock)(id some);
@property(nonatomic,copy) defBlock myDefBlock;
使用
_myDefBlock= ^(idsome){
NSLog(@"%@",some);
};
_myDefBlock(@"hehehe");
5.block作为函数参数
- (void)viewDidLoad {
[superviewDidLoad];
void(^block)(inta)=^(inta){
NSLog(@"%d",a);
};
[selfsomeBlockMethod:block];
}
-(void)someBlockMethod:(void(^)(inta))Myblock
{
Myblock(5);
}
或者[selfsomeBlockMethod:^(inta){
NSLog(@"%d",a);
}];
block的各种变量
Block内访问局部变量
局部变量不改变值,那就是传值进去
局部变量block里面改变值了,得用__block声明,传的是指针进去
Block内访问全局变量
全局变量所占用的内存只有一份,供所有函数共同调用,在Block定义时并未将全局变量的值或者指针传给Block变量所指向的结构体,因此在调用Block之前对局部变量进行修改会影响Block内部的值,同时内部的值也是可以修改的
Block内访问静态变量
在Block定义时便是将静态变量的指针传给Block变量所指向的结构体,因此在调用Block之前对静态变量进行修改会影响Block内部的值,同时内部的值也是可以修改的
Block在ARC下的内存管理的官方案例
MyViewController *myController = [[MyViewController alloc] init];// ...__weakMyViewController *weakMyController = myController;myController.completionHandler = ^(NSIntegerresult) { MyViewController *strongMyController = weakMyController;if(strongMyController) { [strongMyController dismissViewControllerAnimated:YEScompletion:nil]; }else{// Probably nothing...}};[selfpresentViewController:myController animated:YEScompletion:^{}];
__weak虽然解决了循环引用,但是也容易涉及到另一个问题,因为Block是通过弱引用指向了myController对象,那么有可能在调用Block之前myController对象便已经被释放了,所以我们需要在Block内部再定义一个强指针来指向myController对象