2012-06-26 3 views
-1

UITableViewCell 클래스의 별표 평점보기를 표시하기 위해 DYRateView을 사용하고 있습니다. DYRateView의 인스턴스 (UIView의 하위 클래스)는 내 'layoutSubviews'메소드에서 할당되고 초기화됩니다.사용자 정의 UITableViewCell의 Alloc/init

'layoutSubviews'에서보기를 할당/초기화하는 것은 나쁜 습관입니까? 셀이 재사용되면 모든 셀에서/init을 할당하거나 뷰를 재사용합니까?

.H

@property (retain, nonatomic) IBOutlet DYRateView *rateView; 

그러나 당신이 그것을 때마다layoutSubviews가 호출하고있는, 그리고 더 호출됩니다, layoutSubviews에를 할당 할 수 괜찮

- (void)layoutSubviews 
{ 
[super layoutSubviews]; 

rateView = [[DYRateView alloc] initWithFrame:CGRectMake(100, 60, 160, 20) fullStar:[UIImage imageNamed:@"StarFullLarge.png"] emptyStar:[UIImage imageNamed:@"StarEmptyLarge.png"]]; 
    NSLog(@"created"); 

rateView.padding = 10; 
rateView.alignment = RateViewAlignmentCenter; 
rateView.editable = YES; 
rateView.delegate = self; 
rateView.rate = _rating; 
[self.contentView addSubview:rateView]; 
} 

답변

1

하는 .m 할당 직후보다 자주. 따라서 ARC를 사용하지 않는 한 현재 가지고있는 방식으로 메모리가 심하게 누출됩니다. 또한 모든 호출에 대해 항상 contentView에 새로운 rateView 개체를 추가하는 것은 바람직하지 않은 결과를 초래할 것입니다.

하위보기는 셀보기에서 소유하므로 셀보기를 다시 사용하면 다시 사용됩니다.

대신 하위 뷰가 있는지 여부를 확인하고 그에 따라 할당하십시오.

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    if (rateView == nil) { 
     rateView = [[DYRateView alloc] initWithFrame:CGRectMake(...) fullStar:[UIImage imageNamed:@"..."] emptyStar:[UIImage imageNamed:@"..."]]; 

     // rest of rateView set up here 

     [self.contentView addSubview:rateView]; 
    } 
} 
0

나는 그것을 재사용 할 것입니다. 직접 테스트 할 수 있습니다.

NSLog (@ "레이아웃 하위 뷰, 보유 개수는 % d", rateView.retainCount);

사용자 정의 셀의 init 메소드에서이 작업을 수행하는 것이 좋습니다. layoutSubviews에 프레임을 설정하면됩니까? 그것은 더 깨끗해 보인다.

+0

이 방법을 말하는가? '- (id) initWithStyle : (UITableViewCellStyle) style reuseIdentifier : (NSString *) reuseIdentifier' – mnort9

+0

어떤 이유로이 메소드를 구현할 때 결코 호출되지 않습니다. 이것이 스토리 보드를 사용하는 b/c 일 수 있습니까? – mnort9

+0

아마도 - (id) init {}이 호출 될까요? cellForRow에서 셀 생성 방법을 확인하기 만하면됩니다. – MrShoot

관련 문제