Block

一.是么是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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值