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就可以解决循环引用

转载于:https://www.cnblogs.com/yufang/p/5305202.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值