block之循環引用

1.有一個控制器,這個控制器是經過push出來的,web

2.控制器的View上有一個webView,而且拖成了控制器的屬性/也就是myWebView被viewcontroller強引用.atom

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

控制器中重寫了dealloc方法spa

- (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強引用code

>>>>將viewcontroller   push出來,直接點擊back,viewcontroller會被直接釋放,調用dealloc方法,對象

>>>>點擊控制器的View,blog

- (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,因而致使循環引用,引發內存泄露.it

一般若是在block內訪問外部對象,定義一個弱指針指向要在block中訪問到的對象io

  //__weak typeof(self) weakSelf = self;並在block內部使用weakSelf就能夠解決循環引用
相關文章
相關標籤/搜索