2011-02-04 18 views
6

私はUIGestureRecognizerをUIViewに添付しました。 dealloc中にこれをリリースするのは誰の責任ですか?具体的に私はdeallocでUIViewのジェスチャーリリーチャーをリリースする責任がありますか?

UITapGestureRecognizer *t = 
[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)]; 

[self.view addGestureRecognizer:t]; 
[t release]; 

ので、self.viewは現在gestureRecognizerの唯一の保持力を持っています。

更新 私はもっとはっきりしていたはずです。私の質問は、ビューdeallocメソッドと関係しています。ビューのスーパークラスは、ビューが解放されたときにgestureRecognizerのリリースを処理しますか?私は現在そのように仮定しています。

答えて

1

allocnew、またはcopyを呼び出すたびに、releaseと呼ぶことです。

あなたがallocを呼び出したので、あなたのコードは何もリリースされていないか、または漏れていません。

あなたはがあなたのジェスチャー認識を自動解放できますが、私はない明示的にオブジェクトを解放するため、可能な場合は、より良いメモリ管理であるだろう。 (自動解放されたオブジェクトは、自動解放プールが排水されるまでリリースされません)。

2

コードは正しいです。

ビューには、[self.view addGestureRecognizer:t]というジェスチャーリコジンガーの所有権が必要です。

あなたはそれを作成するときにtを自動解放して、コードを整理できます。

UITapGestureRecognizer *t = [[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)] autorelease]; 
[self.view addGestureRecognizer:t]; 

これはtのすべての所有権は、このようにコードがmodifed入った場合の問題を導入する可能性を減らす一つの場所で処理されることを意味します。

+0

自分で解放するのではなく、すべてのオブジェクトで自動解放を呼び出すのは良い習慣ではありません。 – Tieme

+0

@ティエム私は同意しない。これは、すべてのメモリ管理コードを1か所に保持して、可読性を向上させ、したがって、「解放」を忘れることによるリークの可能性を低減する。このメソッドが終了した後でもオブジェクトが保持されるため、遅延リリースはメモリのハイウォーターマークに影響しません。 autoreleaseを使うのは良い習慣ではないと言うあなたの理由は何ですか? –

+0

私はこの例であなたに同意します。ここでautoreleaseを呼び出すのは大丈夫です。しかし、あなたのオブジェクトを自動リリースすることは今でも良い習慣ではありません。結局のところ、メモリ管理にいくらかのオーバーヘッドが加わることになります。 – Tieme

関連する問題