0

メソッドに戻り値 (printf など) がある場合でも、メソッドを void であるかのように呼び出しても問題ないことはわかっていますが、これはどうでしょうか。

[NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(method) userInfo:nil repeats:NO];

返されるオブジェクトを使用せずに、それを浮かせておくことはできますか? これは、ポインターなどに割り当てずに [NSObject alloc] を呼び出すようなものです。それはメモリリークですか?その理由は、変数 (タイマー) に割り当てたくないためです。解放 (または自動解放) すると、起動する前に削除されるためです。そして、私はivarを使いたくありません。それで、私は何をすべきですか?

編集: [self performSelector:@selector(myMethod) withObject:nil afterDelay:0.3]; について知りました。これは、タイマーを使用するよりもはるかに優れています。

4

1 に答える 1

2

この呼び出しによって作成された NSTimer は、現在の NSRunLoop オブジェクトによって所有されているため、自動解放プール ドレインによって自動解放されることはありません。そして、それを手動で解放するのは間違っています。NSTimer は、無効化メッセージを送信して削除する必要があります。

NSRunLoop オブジェクトからのタイマーの削除を要求するには、タイマーがインストールされたのと同じスレッドから無効化メッセージをタイマーに送信します。このメッセージはすぐにタイマーを無効にするため、NSRunLoop オブジェクトには影響しません。実行ループは、invalidate メソッドが戻る直前または後で、タイマーを削除して解放します。

したがって、基本的には変数を用意し、リリースの代わりに無効化を使用する必要があります

于 2009-08-14T22:45:31.797 に答える