2012-09-13 5 views
1

저는 다소 이상한 상황이 있습니다. 메모리 관리를 제대로 이해하지 못하고 있습니다.언제 UITableViewController에서 UINavigationController를 만들었습니까?

UINavigationController를 만들고 메시지를 표시하기 위해 현재 뷰의 하위 뷰로 뷰를 추가하는 메시지를 표시하는 UITableViewController가 있습니다. 내가 겪고있는 문제는 Xcode가 UINavigationController를 공개하지 않아서 잠재적 인 메모리 누수가 있다는 보고서입니다.하지만 아래의 코드처럼 풀면 앱을 다시 클릭하면 오류가 발생합니다. 표보기.

UITableViewController에서 보존 된 속성을 사용하여 현재 UINavigationController를 추적하고 보유 횟수를 관리했지만 분명히 여기에 뭔가 빠져 있습니다.

참고 : 뒤로 버튼이 메시지를 클릭 할 때 충돌이 발생합니다 - [UILayoutContainerView removeFromSuperview :] : 인식 할 수없는 선택기 0x5537db0

이 또한주의 인스턴스에 전송하는 I 코드의 라인을 [NC 릴리스]를 제거하는 경우, 그것을 잘 작동합니다.

@property(nonatomic, retain) UINavigationController *currentNavigationController; 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UINavigationController *nc = [[UINavigationController alloc] init]; 

    CGRect ncFrame = CGRectMake(0.0, 0.0, [[self view] frame].size.width, [[self view] frame].size.height); 
    [[nc view] setFrame:ncFrame]; 

    // I created a CurrentNavigationController property to 
    // manage the retain counts for me 
    [self setCurrentNavigationController:nc]; 

    [[self view] addSubview:[nc view]]; 
    [nc pushViewController:messageDetailViewController animated:YES]; 


    UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonSystemItemRewind target:[nc view] action:@selector(removeFromSuperview:)]; 


    nc.navigationBar.topItem.leftBarButtonItem = bbi; 
    [bbi release]; 

    [nc release]; 
} 

답변

1

UINavigationController가 당신이 만든이 방법 내부에서만 사용 가능하다 "NC"

여기 내 코드입니다. 이 메서드 후에 아무 데에도 저장되지 않습니다 (릴리스하기 때문에). 그래서 navigationController의 뷰를 클래스 뷰에 하위 뷰로 추가 한 다음 navigationController를 삭제합니다. 그건 틀렸어요. 뷰와 뷰 컨트롤러가 navigationController를 참조하려고 할 때 (존재하지 않을 때) 앱이 중단됩니다. 하지 말았어야 removeFromSuperview 방법에 대한

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    UINavigationController *nc = [[UINavigationController alloc] init]; 

    CGRect ncFrame = CGRectMake(0.0, 0.0, [[self view] frame].size.width, [[self view] frame].size.height); 
    [[nc view] setFrame:ncFrame]; 

    [self setCurrentNavigationController:nc]; 
    [nc release]; 

    [[self view] addSubview:[self.currentNavigationController view]]; 

    UIViewController *viewCont = [[UIViewController alloc] init]; 
    [viewCont.view setBackgroundColor:[UIColor greenColor]]; 

    [nc pushViewController:viewCont animated:YES]; 

    NSLog(@"CLASS %@",[[self.currentNavigationController view]class]); 

    UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonSystemItemRewind target:[self.currentNavigationController view] action:@selector(removeFromSuperview)]; 


    self.currentNavigationController.navigationBar.topItem.leftBarButtonItem = bbi; 
    [bbi release]; 
} 

선택기 ""결국 다음

는 didSelectRowForIndexPath 방법에 대한 코드입니다. 인자가 없습니다 :)

+0

처음으로 귀하의 속성을 알지 못했습니다 ... 나는 새로운 navigationControllers를 만들기 때문에 응용 프로그램이 다운 된 것 같습니다. 귀하의 속성에 그것을 할당하면, 오래된 하나가 지워지고 있으며, 그것의 모든 의견을 unhadled입니다 ... –

+0

뒤로 버튼을 클릭하면 내가보기를 팝하는 방법을 보여주는 내 코드를 편집했습니다. 새로운 네비게이션 컨트롤러가 추가 될 때까지 뷰는 모두 사라져야합니다. 그러나 뒤로 버튼을 클릭하면 앱이 다운되는 것을주의해야합니다. – jwoww

+0

해결책을 찾았습니다. 답변을 수정하고 코드를 추가하려고합니다. –

관련 문제