zoukankan      html  css  js  c++  java
  • block之循环引用

    1.有一个控制器,这个控制器是通过push出来的,

    2.控制器的View上有一个webView,并且拖成了控制器的属性/也就是myWebView被viewcontroller强引用.

    @property (weak, nonatomic) IBOutlet YFWebView *myWebView;

    控制器中重写了dealloc方法

    - (void)dealloc
    {
        NSLog(@"dealloc");
    }

    有一个webView类描述myWebView,这个类是这样的

    #import <UIKit/UIKit.h>
    
    typedef void(^myBlock)(int a);
    
    @interface YFWebView : UIWebView
    
    @property (nonatomic,copy) myBlock myBlock;
    
    @end
    
    
    
    #import "YFWebView.h"
    
    @implementation YFWebView
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
    
        NSLog(@"%s",__func__);
    
        if (self.myBlock) {
            self.myBlock(1);
        }
    }

    也就是myBlock被myWebView强引用,相当于myBlock被viewcontroller强引用

    >>>>将viewcontroller   push出来,直接点击back,viewcontroller会被直接释放,调用dealloc方法,

    >>>>点击控制器的View,

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
    
        NSLog(@"%s",__func__);
    
        //__weak typeof(self) weakSelf = self;
    
        self.myWebView.myBlock = ^(int Vca)
        {
          //  NSLog(@"%@",weakSelf);
          NSLog(@"%@",self); NSLog(
    @"%d",Vca); }; }

    同样再点击back返回,控制器的dealloc方法并未被调用,也就是无法释放

    因为在myBlock的定义中用到了控制器,只要在block中访问外部对象,都是强引用这个对象,于是myBlock又强引用self,于是导致循环引用,引起内存泄露.

    通常如果在block内访问外部对象,定义一个弱指针指向要在block中访问到的对象

      //__weak typeof(self) weakSelf = self;

    并在block内部使用weakSelf就可以解决循环引用
  • 相关阅读:
    波涛 - 系统交易方法(2013年2月28日)
    【美】柯蒂斯·费思 - 海龟交易法则(2012年12月25日)
    【美】迈克尔·卡沃尔 - 趋势跟踪(2012年12月3日)
    DAX/PowerBI系列
    DAX基础入门
    (玩起来)DAX/PowerBI系列
    DAX/PowerBI系列
    DAX/PowerBI系列
    DAX/PowerBI系列
    MDX 用Ancestors得到Hierarchy中指定Level的值(附带SCOPE用法之一)
  • 原文地址:https://www.cnblogs.com/yufang/p/5305202.html
Copyright © 2011-2022 走看看