ARC 에서 MJrefresh 를 사용 할 때 tableView 순환 참조 에 주의해 야 합 니 다.

코드 를 직접 올 리 는 것 은 게 으 른 로 딩 입 니 다.대부분의 친구 들 이 MJrefresh 를 사용 할 때 메모리 관리 오류 가 발생 한 것 을 발견 했다 고 믿 습 니 다.
#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 입 니 다.즉,
_tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
#pragma mark======      
            NSLog(@"      ");
            
            [_tableView.mj_footer endRefreshing];
        }];

_tableView 의 mjfooter 내 부 는 이 렇 습 니 다.self 는 입 니 다.tableView;
- (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
    }
}

그런데 저희 가 블 락 에 이렇게 썼어 요.
[MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
            [_tableView.mj_footer endRefreshing];
        }]

분명 해,만 들 었 어tableView 의 순환 인용,이어서 우리 의tableView 는 strong 형식 입 니 다.순환 참조 가 가 져 온 결 과 는 소속 viewController 대상 이 풀 리 지 않 아 dealloc 가 실행 할 수 없습니다.우 리 는 이런 상황 을 깨 야 한다.깨 뜨리 기만 하면table View 의 순환 참조 가 성공 하 였 습 니 다.
그래서 view Controller 의 self 를 약 한 타 입의 weak Self 로 바 꿔 야 합 니 다. ,(변 하지 않 습 니 다.이 걸 보 세 요weak __typeof(&*self)weakSelf = self;할 수 있 습 니 다.무시 하 십시오)즉,전체 줄 코드 가 바 뀌 었 습 니 다. [weakSelf.tableView.mj_footer endRefreshing];
이렇게 되면 mj 에 게 도footer 의 block 에 나 타 났 어 요. 
[weakSelf.tableView.mj_footer endRefreshing]; weak Self 는 모두 약 한 유형 입 니 다.안의 tableView 도 이에 따라 방출 됩 니 다.tableView 의 순환 인용 도 해결 되 고 순환 인용 이 해결 되 며 dealloc 방법 도 정상 으로 돌아 갑 니 다.

좋은 웹페이지 즐겨찾기