1

ここにはあまりコードはありませんが、この問題は私を非常に悩ませています!

.h:

@interface processController : UIViewController {
         NSTimer *timer;
}
@property (nonatomic, retain) NSTimer *timer;

.m:

- (void)viewDidLoad {
    [super viewDidLoad];
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector (main) userInfo:nil repeats:YES];
}
- (void)main {
    NSLog(@"testing");
}
- (void)viewDidUnload {
    [self.timer invalidate];
    self.timer = nil;
}

奇妙なことに、このコードを起動すると、次のようになります。

ViewController *main = [[ViewController alloc] initWithNibName:nil bundle:nil];
    [self presentModalViewController:main animated:YES];

ビューを切り替えると、タイマーが鳴り続けます!私は何を間違っていますか?

4

1 に答える 1

5

viewDidUnloadビューが画面から削除されたときに呼び出されるのではなく、アプリケーションがメモリ警告を受け取ったときにのみ呼び出されます。UIViewController の割り当てが解除された場合も呼び出されません。Appleのドキュメントから:

メモリ不足の状態が発生し、現在のビュー コントローラーのビューが必要ない場合、システムはそれらのビューをメモリから削除することを選択する場合があります。このメソッドは、View Controller のビューが解放された後に呼び出され、最終的なクリーンアップを実行するチャンスです。ビュー コントローラがビューまたはそのサブビューへの個別の参照を格納している場合は、このメソッドを使用してそれらの参照を解放する必要があります。このメソッドを使用して、ビューをサポートするために作成したオブジェクトへの参照を削除することもできますが、ビューがなくなったために不要になりました。このメソッドを使用して、ユーザー データや、簡単に再作成できないその他の情報を解放しないでください。

あなたはおそらく使用するつもりでしたviewWillDisappear

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.timer invalidate];
    self.timer = nil;
}   

コントローラーのビュー プロパティにアクセスするとすぐに viewDidLoad が呼び出されるため、viewWillAppear でタイマーを開始することをお勧めします。ビューが表示されている場合は必ずしもそうではありません。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(main) userInfo:nil repeats:YES];
}

UIViewController documentationからviewDidLoadとviewDidUnload、およびviewWillAppearとviewWillDisappearの議論を読むことをお勧めします。

于 2012-07-07T16:25:43.860 に答える