iOS block

作者: crazyfox | 来源:发表于2017-03-07 10:50 被阅读10次

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对象

参考http://www.jianshu.com/p/14efa33b3562

相关文章

网友评论

      本文标题:iOS block

      本文链接:https://www.haomeiwen.com/subject/gjuugttx.html