iOS_Block详解2(解决循环引用)

请仔细看代码:
/*
 1.Block对象通常会使用外部创建的其它变量(基本类型的变量,或者指向其他对象的指针)---》外部变量。
 
 2.当执行block对象时,为了确保其下的外部变量能够始终存在,相应的block对象会捕获这些变量。
    1)对基本类型的变量,捕获意味着程序会拷贝变量的值,并用Block对象内的局部变量保存。
    2)对指针类型的变量,block对象会使用强引用。意味着block对象用到的对象,都会被保留。
 */

#import "ViewController.h"

@interface ViewController ()
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)int age;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.name=@"gujinyue";
    self.age=23;
    
    /*
     1.本控制器(self)创建一个Block,每次执行Block又都会打印本控制器(self).
     也即本控制器有一个指向block对象的指针,而这个block又会捕获本控制器,即有一个指回本控制器的指针,这样就陷入强引用循环。
     
     2.为了打破这个强引用循环,可以现在block对象外面声明一个__weak指针,然后将这个指针指向block对象使用的self,最后在block对象中使用这个新的指针。
     */
    
    
    __weak ViewController *controller=self;
    
    void(^myBlock)(void)=^(){
        
        
        /*
         1.现在这个block对self是弱引用,强引用循环打破了。但是由于是弱引用,所以self在执行的时候有可能被释放。
         2.可以在block对象中创建一个对self的局部强引用
         */
        //NSLog(@"%@ %d",controller.name,controller.age);
        
        ViewController *innerVc=controller;//局部强引用
        //注意不要直接存取实例变量,而是使用存取方法
        NSLog(@"%@ %d",innerVc.name,innerVc.age);
    };
    
    myBlock();
    
}
@end

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值