block解决循环引用(一)

看了网上的一些资料,感觉晕乎乎的,还不是很明白。自己抽了一个下午仔细的研究了一下block,嗯,明白了好多。分两次写出来,欢迎大家交流。
这里不讨论底层,不讨论原理,注重实用!


什么是block?

闭包(block):闭包就是获取其他函数局部变量的匿名函数。


block格式:

返回值类型(^block变量名)(形参列表) = ^(形参列表) {

 };

 //有参数无返回值
    void (^myBlock)(NSString* ) = ^(NSString *myBlockStr){
        NSLog(@"%@",myBlockStr);
    };

    myBlock(@"safeed");


    //有参数有返回值
    NSString* (^myBlock1)(NSString* ) = ^(NSString *myBlockStr){
        NSLog(@"%@",myBlockStr);
        return @"我是返回值";
    };

    NSLog(@"%@",myBlock1(@"参数值"));

什么情况下会造成循环引用?

当前控制器引用着block,block引用这当前控制器,就会造成循环引用。


避免循环引用详解

typedef void (^MyBlock)(NSString *myBlockStr);
@interface ViewController ()
@property (nonatomic,strong)MyBlock myBlock;
这里声明了一个带参数不带返回值的block
//1.不会循环引用
    self.myBlock = ^(NSString *myBlockStr) {
        NSLog(@"%@",myBlockStr);
    };
    //self引用了myBlock,但是在myBlock并没有self什么事情,只是打印了一下参数myBlockStr,并不会造成循环引用
    self.myBlock(@"myBlockStr201");

1.通过Leaks可以看到,是没有内存泄露的
这里写图片描述

//2.会循环引用
    self.myBlock = ^(NSString *myBlockStr) {

        NSLog(@"%@",self.str);
        NSLog(@"%@",self.str = myBlockStr);

    };
    //这个就是典型的block循环引用了,self引用了myBlock,myBlock内部引用了self,想要解除循环引用,需要在block外部弱引用一下self, __weak typeof(self) weakSelf = self;
    self.myBlock(@"myBlockStr202");

2.通过Leaks可以看到,有内存泄露
这里写图片描述

  //3.解除循环引用
    __weak typeof(self) weakSelf = self;

    self.myBlock = ^(NSString *myBlockStr) {

        NSLog(@"%@",weakSelf.str);
        NSLog(@"%@",weakSelf.str = myBlockStr);

    };

    self.myBlock(@"myBlockStr203");

    //4.block内修改外部变量
    __block NSString *myStr = @"2000q";

    self.myBlock = ^(NSString *myBlockStr) {

        myStr = @"200a";
        NSLog(@"%@",myBlockStr);
        NSLog(@"%@",myStr);
    };
    //Block不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。__block 所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值
    self.myBlock(@"myBlockStr204");
//5.block的简单使用升级
这里在viewController里面导入一个Persopn类,里面有一个block
typedef void (^MyBlock)(NSString * str);
@property(nonatomic,strong)MyBlock myBlock;

在viewController
@property(nonatomic,strong)NSString *str;
@property (nonatomic,strong)Person *person;

 self.person.myBlock = ^(NSString *str) {

            NSLog(@"%@",self.person.personStr);
            NSLog(@"%@",self.person);
            NSLog(@"%@",self.str);
            NSLog(@"%@",self.str = str);
        };
//这种也会造成循环引用,想要解决请参照3

由于时间的原因,先写这么多,附上demo的下载地址(https://github.com/2877025939/block)。
(二)会增加反向传值,block在对象方法中的使用。
欢迎大家交流,qq:2877025939.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值