0

UIViewController 하위 뷰를 추가하려고 시도하고 단추를 클릭하여 닫습니다. 현재 코드가 제대로 작동하지 않습니다. 누출인지 문제가 있는지 확실하지 않습니다.하위 뷰에 UIViewController를 추가하고 제거하는 가장 올바른 방법은 무엇입니까?

그래서 먼저 내가 하위 뷰를 추가

newViewController.m에서 다음
-(IBAction)openNewView:(id)sender{ 
    // start animation 
    [UIView beginAnimations:@"CurlUp" context:nil]; 
    [UIView setAnimationDuration:.3]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; 

    // add the view 
    newViewController* newVC = [[newViewController alloc] initWithNibName:@"newViewController" bundle:[NSBundle mainBundle]]; 
    [self.view addSubview:newVC.view]; 

    [UIView commitAnimations]; 
} 

나는

-(IBAction)closeNewView:(id)sender{ 
    // start animation 
    [UIView beginAnimations:@"curldown" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDuration:.3]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view.superview cache:YES]; 

    // close dialog 
    [self.view removeFromSuperview]; 
    [UIView commitAnimations]; 

    [self.view release]; 
} 

내가 코드를 분석 할 때이 그것을하지만, 작동 말했듯이 제거 할 수있는 기능을 가지고 알려줍니다 :

X에 할당되어 'newViewController'에 저장되는 객체의 누출 가능성 :

대신 [self.view release]
newViewController* newVC = [[newViewController alloc] initWithNibName:@"newViewController" bundle:[NSBundle mainBundle]]; 

와 나는의 ViewController를 autorelease 경우 [self.view release];

의 전화를 건 사람에 의해이 시점에서 소유하지 않은 객체의 참조 횟수의

잘못된 감소는 (또한 경우 제거에 충돌 - [FirstViewController performSelector : withObject : withObject :] : 해제 된 인스턴스에 메시지가 전송 됨 0xd21c7e0

012Controlroller에 [newVC release]을 호출하면빌드가 실패합니다.

바라건대 나는 꽤 분명한 질문을하지는 않지만, viewControllers를 추가하고 제거하는 올바른 방법은 무엇입니까?

답변

0

어떤 IOS 버전을 사용하고 있습니까? 5.0을 사용하는 경우 ARC로 전환해야하므로 [릴리스] 통화를 처리 할 필요가 없습니다.

여전히 수동 메모리 관리가 필요하거나 필요하다면 : newVC를 해제하려고하면 dealloc 빌드가 실패하는 이유는 해당 포인터가 openNewView 함수 범위에 있기 때문입니다. 반원으로 만들어서 석방 할 수 있습니다.

@implementation WhateverItsCalled { 
    newViewController *newVC; 
} 

- (IBAction) openNewView: (id)sender { 
... 
    newVC = [ [ newViewController alloc ] initWithNibNamed:... 
} 

- (void) dealloc { 
    [ newVC release ]; 
} 

그리고 당신은 ARC를 사용하지 않는 경우 예, 모든 "ALLOC" 해당 "해제"와 결합해야합니다.

또한 질문해야합니다 - 여기 왜보기 컨트롤러를 사용하고 있습니까? 보기 만 원한다면 [[NSBundle mainBundle] loadNibNamed]를 사용하여 NIB에서보기를로드하고 파일의 소유자로 [self]를 나열 할 수 있습니다. 이렇게하면 원하는 모든보기 (원하는보기 포함)가 설정되고 불필요한보기 컨트롤러를 인스턴스화 할 필요가 없습니다.

+0

이것은 두 번째 앱입니다. 첫 번째 앱은 두 번째 앱이기 때문에 두 번째 앱은 두 번째 앱이므로 새로운 앱입니다. 내가 생각하기에 펜촉 만 사용하지는 않았다. 어쨌든 빌드 셋팅에서 ARC를 켜고, 모든 릴리즈를 지우고, 그것을 해제하고, '[newViewController performSelector : withObject : withObject :] : 메시지를 할당 해제 된 인스턴스 0x6b34c70'으로 보냈습니다. 내가 @ 인터페이스의 newViewController'로 변경하는 경우 : UIView의 {'와 전화'[[NSBundle mainBundle] loadNibNamed : 자기 옵션 : "dateViewController"소유자 @ 전무]'(내 절반 아마 잘못이다)을 즉시 SIGABRT가 Main에 있습니다.m – Kevin

+0

"할당 취소 된 인스턴스로 보낸 메시지"오류는 어디서 나옵니까? 예외 중단 점 (중단 점보기를 표시하려면 Cmd + 6, 왼쪽 하단 모서리에 "+")을 설정하여 이것이 어디에서 왔는지 정확하게 확인하십시오. –

+0

NIB에 "self"라는 해당 속성이없는 콘센트가 있기 때문에 대부분 SIGABRT가 표시됩니다. NIB로 가서 "파일 소유자"자리 표시자를 클릭하고 콘센트보기 (Cmd + Option + 6)로 전환하십시오. 거기에 명명 된 모든 변수는 NIB가로드 될 때 "self"에 해당 속성이 있어야합니다. 뷰 컨트롤러 자체에서 비슷한 속성을 사용하고있을 가능성이 큽니다. –

관련 문제