直接上代碼,這是一個懶加載,相信大多數朋友已經發如今使用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