2013-08-07 2 views
0

navigationController의 신비를 이해하도록 도와주세요. didFinishLaunchingWithOptions에서 호출되는 HomeViewController가 있습니다. HomeViewController 사용자 프레스에서 버튼과 내 코드는 내가navigationController 팝업 후 계속 실행

-(IBAction)goBackToHome:(id)sender 
{ 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [appDelegate.navigationController popViewControllerAnimated:YES]; 
} 

내가 한 번 내가 MapViewController에서 나는 인상했다 코드를 사용

-(IBAction)showMap:(id)sender 
{ 
    MapViewController *mapViewController = Nil; 
    mapViewController = [[MapViewController alloc] initWithNibName:@"MapView-iPad" bundle:nil]; 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [appDelegate.navigationController pushViewController:mapViewController animated:YES]; 
} 

는 사용자가 다시 MapViewController에서 가고 싶어 할 때입니다, MapViewController와 관련된 모든 리소스가 해제됩니다. 이 코드를 MapViewController의 initWithNibName 안에 넣었는지 확인하려면.

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    // Custom initialization 
    [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(printMessage) userInfo:nil repeats:YES]; 
} 
return self; 
} 

-(void) printMessage 
{ 
    NSLog(@"I am inside Map View Controller"); 
} 

놀랍게도 MapViewController를 터뜨린 후에도 printMessage는 계속 진행됩니다. 진행중인 작업과 MapViewController가 아직 실행중인 이유를 이해해주세요. MapViewController가 해제되었는지 확인할 수있는 방법이 있습니까?

+0

, 수 있도록 사용 : [self.navigationController popViewControllerAnimated : YES]; 시도해보십시오. – crz

+0

dealloc을 구현하고 로그를 넣음으로써 할당 해제 시점을 확인할 수 있습니다. – rdelmar

+0

@ user1191140 : 답변 중 하나가 도움이 되었다면 동의하십시오. 그렇지 않으면 설명을 요청하십시오. [누군가 내 질문에 대답하면 어떻게해야합니까?]] (http://stackoverflow.com/help/someone-answers) – Sebastian

답변

0

documentation for NSTimer을 살펴보십시오. 특히, scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: 방법. 문서는

대상 가 목적은 aSelector 때 타이머 화재에 의해 지정된 메시지를 보내는 것을 말한다. 대상 객체는 타이머에 의해 유지되고 타이머가 무효화되면 해제됩니다.

즉, 타이머가 MapViewController을 유지하게됩니다. 컨트롤러에 대한 참조를 보유하고있는 타이머가 없다면, 네비게이션 컨트롤러에서 팝업 할 때 할당 해제되어야합니다.

0

MapViewController은 여전히 ​​유지됩니다. 타이머는 ViewController을 유지하며 예약 된 실행 루프에 의해 타이머가 유지됩니다. MapViewController을 출시하려면 [yourTimer invalidate]을 사용하여 실행 루프에서 타이머를 제거해야합니다. 이렇게하는 한 가지 방법은 당신의 타이머에 약한 참조를 유지하는 것입니다 MapViewController :

self.timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(printMessage) userInfo:nil repeats:YES]; 

지금 당신은 타이머를 무효화 할 수 있습니다 : 당신은 타이머를 만들 때 속성에 할당

@property (weak) NSTimer *timer; 

당신이 더 이상 그것을 필요로하지 않을 때, 예. viewWillDisappear에서 : 당신이 HomeViewController을 돌아가 싶어 할 때

- (void)viewWillDisappear { 
    [self.timer invalidate]; 
    [super viewWillDisappear]; 
} 
관련 문제