2010-02-25 3 views
0

UIView가 포함 된 UIViewController가 있습니다. viewcontroller가 표시 될 때마다 UIView를 지워야하고 콘텐츠가 다시로드되어야합니다. 문제는 이전 콘텐츠가 여전히 UIView에 나타납니다. 컨트롤러가 표시되기 전에UIViewController로 UIView 제거 및 다시 삽입

데이터로드 :

- (void)viewWillAppear:(BOOL)animated 
{ 
    contentView = [[ContentView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)]; 
    contentView.userInteractionEnabled = NO; 
    [self.view addSubview:contentView]; 

    if([self loadContentData] == NO) { 
     [contentView release]; 
     return NO; 
    } 
    return YES; 
} 

제거 내용이 컨트롤러 후 숨겨진 :

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [contentView removeFromSuperview]; 
    [contentView release]; 
} 

이유는 충분이 정리하지?

+1

당신이 viewWillAppear'에서 값을 반환하는 이유 : '. 무효 선별 자입니다. –

답변

0

시도 :이 메서드를 재정의 할 때

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
    [contentView removeFromSuperView]; //releases contentView 
} 

당신은 슈퍼의 메서드를 호출해야합니다.

또한 contentView는 게시 한 코드에서 과도하게 공개되어 실제 코드의 어딘가에 있다고 생각할 수 있습니다. 이 경우 contentView가 지나치게 유지되어 뷰 계층에서 릴리스 및 정리되지 않도록 할 수 있습니다.

나는 당신이이 라인을 따라 뭔가를 찾아 제안 :

- (void)viewWillAppear:(BOOL)animated 
{ 
    contentView = [[[ContentView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)] autorelease]; 
    contentView.userInteractionEnabled = NO; 
    [self.view addSubview:contentView]; 

    if([self loadContentData] == NO) { 
     //[contentView release]; //ContentView is now autoreleased and will be dropped when the method exits. 
     return NO; //this probably has a compiler warning, since it is a (void) method 
    } 
    return YES; //this probably has a compiler warning, since it is a (void) method 
} 
+0

removeFromSuperView는 뷰의 수퍼 뷰 보유를 해제합니다. 생성 된 뷰는 +1이 유지되기 전에 뷰가 해제되었으므로 수퍼 뷰에 할당되면 +2, 수퍼 뷰에 할당되면 +1됩니다. OP는 여전히 contentView를 릴리스해야합니다. 그렇지 않으면 메모리 누수가 발생합니다. –

+0

나는 OP의 실제 코드가 어떻게 생겼는지에 대해 의문을 제기합니다. if 문을 실행하면 끝났습니다. 그가 (void) 메소드에 대한 값을 리턴한다는 사실은 초기에 뷰를 설정하기 위해 게시 된 것보다 실제 코드에 더 많은 것이 있다고 믿게합니다. 더 명확하게 대답을 편집 할 것입니다. –

관련 문제