2

내가 이렇게 내 UICollectionViewCell의 속성을 선언했습니다이 목표 C의 유지주기입니까?

@property (nonatomic, copy) void(^onSelection)(BOOL selected); 

이 같은 -setSelected:를 오버라이드 (override) :

- (void)setSelected:(BOOL)selected { 
    [super setSelected:selected]; 

    if (self.onSelection != NULL) { 
     self.onSelection(selected); 
    } 
} 

그런 다음 -cellForItemAtIndexPath:에 내가이

cell.onSelection = ^(BOOL selected) { 
    //the compiler is telling me this might be a retain cycle but i dont think so... 
    cell.tintColor = [UIColor redColor]; 
}; 

같은 구성이다 유지주기?

감사합니다.

답변

3

예입니다. 대신 약한 + 강한 콤보를 사용해야합니다. 당신이 setSelected:의 내부 하위 클래스에서 셀을 업데이트하거나 테이블 뷰 컨트롤러에 tableView:didSelectRowAtIndexPath:을 처리 할 수 ​​있기 때문에 특정 경우

__weak typeof(cell) weakCell = cell; 
cell.onSelection = ^(BOOL selected) { 
    __strong typeof(weakCell) strongCell = weakCell; 
    //the compiler is telling me this might be a retain cycle but i dont think so... 
    strongCell.tintColor = [UIColor redColor]; 
}; 

은 당신도이 블록이 필요하지 않습니다.

+0

당신은 대리인 방법에 대해 옳았습니다. 이 특별한 경우에 대해 더 궁금합니다. 제 추론은 다음과 같습니다. 두 객체가 서로에 대해 강력한 참조를 유지할 때 유지주기가 발생합니다. 이 특정 예제에서 셀은 자체에 대한 강력한 참조를 유지할 수 없습니다 ... 가능합니까? –

+3

여기의 문제는 셀이 블록에 대한 강력한 참조를 유지하고 블록이 셀에 대한 강력한 참조를 유지한다는 것입니다. 그들은 명시 적으로'cell.onSelection = nil;'을 말할 때까지 서로를 공개하지 않을 것입니다. – Andy

+0

두 개의 객체가 서로 유지되면, 명시 적으로 해제 될 때까지이주기를 깨뜨릴 수있는 방법이 없습니다. 생각을위한 음식 : 사람들이 비틀 거리는 전형적인 사이클은 '무효화'가 호출 될 때까지 사이클을 깨지 않는 'NSTimer'입니다. 따라서 dealloc이 호출되지 않기 때문에 'dealloc'에서 '무효화'를 호출하는 것은 불가능한 것처럼 보입니다. – Andy