0

ナビゲーションコントローラの謎を理解するのを手伝ってください。didFinishLaunchingWithOptions から呼び出される HomeViewController があります。HomeViewController ユーザーからボタンを押すと、私のコードは

-(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 から戻りたい場合、コードを使用します

-(IBAction)goBackToHome:(id)sender
{
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    [appDelegate.navigationController popViewControllerAnimated: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 が解放されたことを確認する方法はありますか?

4

2 に答える 2

0

NSTimerのドキュメントを見てください。特に、scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:メソッド。ドキュメントには、

target タイマーが起動したときに、aSelector によって指定されたメッセージの送信先のオブジェクト。対象オブジェクトはタイマーによって保持され、タイマーが無効になると解放されます。

これは、タイマーが原因でMapViewControllerが保持されていることを意味します。そのタイマーがコントローラーへの参照を保持していない場合、ナビゲーションコントローラーからポップするときに実際に割り当てを解除する必要があります。

于 2013-08-07T01:15:01.723 に答える
0

MapViewControllerはまだ保持されています:ViewControllerタイマーは を保持し、タイマーはスケジュールされている実行ループによって保持されます。解放するMapViewControllerには、 を使用して実行ループからタイマーを削除する必要があります[yourTimer invalidate]。これを行う1つの方法は、あなたのタイマーへの弱参照を保持することですMapViewController:

@property (weak) NSTimer *timer;

タイマーを作成するときは、次のプロパティに割り当てます。

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

これで、タイマーが不要になったときにタイマーを無効にすることができますviewWillDisappear

- (void)viewWillDisappear {
    [self.timer invalidate];
    [super viewWillDisappear];
}
于 2013-08-07T02:06:29.450 に答える