IOS Block循环引用的内存泄漏问题

来源:互联网 发布:赛迪智库待遇知乎 编辑:程序博客网 时间:2024/06/05 08:00

IOS 在MRC(非ARC)内存管理方式下,中如果Block调用了self的方法,那self的引用计数会被block +1, 如果处理不当会当值内存泄漏。

@implementation ISSChartLineViewController

- (void)dealloc

{

[_lineViewrelease];

[_changeDataButtonrelease];

[superdealloc];

}

- (void)viewWillAppear:(BOOL)animated

{

    [superviewWillAppear:animated];

    _lineView = [[ISSChartLineViewalloc] initWithFrame:self.view.boundslineData:[[ISSChartDataGeneratorsharedInstance]lineData]];

    _lineView.didSelectedLines = ^ISSChartHintView *(ISSChartLineView *lineView,NSArray *lines,NSInteger index,ISSChartAxisItem *xAxisItem) {

return [selfgetHintView:lineView lines:lines index:index xAxisItem:xAxisItem];

    };

    //here need to optimization

    [self.viewaddSubview:_lineView];

    [self.viewbringSubviewToFront:self.changeDataButton];

}


如果这样写,回退到上一个界面的时候dealloc方式是不会调用的,因为self被block应用在,这样会导致self一直放在内存中,修改如下即可:


- (void)viewWillAppear:(BOOL)animated

{

    [superviewWillAppear:animated];

    _lineView = [[ISSChartLineViewalloc] initWithFrame:self.view.boundslineData:[[ISSChartDataGeneratorsharedInstance]lineData]];

__blocktypeof(self)weakSelf =self;

    _lineView.didSelectedLines = ^ISSChartHintView *(ISSChartLineView *lineView,NSArray *lines,NSInteger index,ISSChartAxisItem *xAxisItem) {

return [weakSelfgetHintView:lineView lines:lines index:index xAxisItem:xAxisItem];

    };

    //here need to optimization

    [self.viewaddSubview:_lineView];

    [self.viewbringSubviewToFront:self.changeDataButton];

}



原创粉丝点击