Block

来源:互联网 发布:php 7.0 phpmyadmin 编辑:程序博客网 时间:2024/04/29 06:13

一.是么是Block

Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似。block就是闭包,可以用来回调。

二.什么情况下使用Block

定义参数列表、返回类型外,还能够获取被定义时的词法范围内的状态(比如局部变量),并且在一定条件下(比如使用__block变量)能够修改这些状态  

三.Block关键字

block 对外部变量只是可读的,如果要想可读可写就需要加上__Block

四.Block申明





五.传参Block



#import "ViewController.h"typedef void (^MyBlock)(NSString *str);//typedef定义一个block@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    MyBlock tblock = ^(NSString *str) {    NSLog(@"-----%@", str);//1    };    [self testBlock:tblock];//2}- (void)testBlock:(MyBlock)mBlock//如果开始没有用typedef定义的话,此处的函数变为- (void)testBlock:(void(^)(NSString *str))myblock//简单的说格式就是 “返回值 + (^) + 参数 + 名字”{    mBlock(@"1111");//3}
在上面的代码中,我们写了一个testBlock的函数,将我们的tblock作为参数传到了testBlock函数里面,然后再testBlock里用mBlock调用了我们所写的MyBlock这个函数。




六.ios开发中,开了ARC模式,系统自动管理内存,如果程序中用到了block就要注意循环引用带来的内存泄露问题

某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.someBlock = ^(Type var){[self dosomething];或者self.otherVar = XXX;或者_otherVar = ...};block的这种循环引用会被编译器捕捉到并及时提醒

用__weak把self重新引用

__weak ViewController *weakSelf = self;
对于非ARC下, 为了防止循环引用, 我们使用__block来修饰在Block中使用的对象:
对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中使用的对象。原理就是:ARC中,Block中如果引用了__strong修饰符的自动变量,则相当于Block对该变量的引用计数+1。


1 0
原创粉丝点击