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