ARC下使用MJRefresh時須要注意tableView循環引用

直接上代碼,這是一個懶加載,相信大多數朋友已經發如今使用MJRefresh時出現了內存管理的錯誤spa

#pragma mark======建立主界面
- (UITableView  *)tableView
{
    if (!_tableView) {
        
        _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 108, WIDTH, HEIGHT-108-44) style:UITableViewStylePlain];
        _tableView.backgroundColor = [UIColor colorWithRed:220/255.0 green:222/255.0 blue:222/255.0 alpha:1];
        _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        _tableView.dataSource = self;
        _tableView.delegate = self;
        [_tableView registerNib:[UINib nibWithNibName:@"OldGoodsCell" bundle:nil] forCellReuseIdentifier:@"cell"];
        _tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(refersh)];
        _tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
#pragma mark======加載更多數據
            NSLog(@"加載更多數據");
            
            [_tableView.mj_footer endRefreshing];
        }];

    }
    return _tableView;
}

上述代碼中,形成循環引用的地方依然是最基本的block,即code

_tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
#pragma mark======加載更多數據
            NSLog(@"加載更多數據");
            
            [_tableView.mj_footer endRefreshing];
        }];

_tableView的mj_footer內部是這樣的,self就是_tableView;orm

- (void)setMj_footer:(MJRefreshFooter *)mj_footer
{
    if (mj_footer != self.mj_footer) {
        // 刪除舊的,添加新的
        [self.mj_footer removeFromSuperview];
        [self addSubview:mj_footer];
        
        // 存儲新的
        [self willChangeValueForKey:@"mj_footer"]; // KVO
        objc_setAssociatedObject(self, &MJRefreshFooterKey,
                                 mj_footer, OBJC_ASSOCIATION_ASSIGN);
        [self didChangeValueForKey:@"mj_footer"]; // KVO
    }
}

可是,咱們在block裏是這樣寫的對象

[MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
            [_tableView.mj_footer endRefreshing];
        }]

很明顯,形成了_tableView 的 循環引用,緊接着因爲咱們的_tableView 是 strong 類型的,它的循環引用帶來的結果就是所屬的viewController對象沒法釋放,繼而形成dealloc沒法執行。咱們要打破這種狀況,只要打破_tableView的循環引用就成功了。內存

因此咱們要把viewController的self變成弱類型的weakSelf  ,(不會變的請看這個__weak __typeof(&*self)weakSelf = self;會的請忽略) 即整行代碼變成 [weakSelf.tableView.mj_footer endRefreshing];ci

這樣一來,即便在給mj_footer的block裏出現了 rem

[weakSelf.tableView.mj_footer endRefreshing]; weakSelf都是弱類型的了,裏面的tableView也會隨之釋放,tableView的循環引用也就解決,循環引用的解決,dealloc方法也就恢復正常get

相關文章
相關標籤/搜索