1

self.ivar =(コンビニエンスメソッド)をオブジェクトの'init'メソッドで使用するのは悪いことだと読みました。これは、継承を台無しにするからです。

ただし、オブジェクトをサブクラス化しないことがわかっている場合は、自己キーワード割り当てを使用しても大丈夫ですか?

i.e. self.iVar = [Object objectConvenienceMethod];

私が尋ねる理由はこれです。独自のinitメソッドを使用して新しいオブジェクトを作成し、そのメソッドでさまざまな初期割り当てを実行します。selfキーワードを使用しないため、iVarに直接割り当てます。したがって、convenienceメソッドではなくallocメソッドを使用します。つまり

iVar = [[Object alloc] init];

または、便利な方法を使用する場合は、それを保持します。つまり

iVar = [[Object convenienceMethod]retain]

しかし...メモリリークツールをオンにしてプログラムを実行すると、これらの割り当てはすべてメモリリークとして識別されます。

alloc-initの代わりにselfキーワードと便利なメソッドを使用できる場合は、これで問題を回避できます。

ただし、alloc-initアプローチを使用することを選択した場合、iVarをどこでリリースすることになっていますか?ちょうどdeallocで?

ご協力いただきありがとうございます :)

マイケル

4

3 に答える 3

2

いいえ、考慮する必要があるのはサブクラスの動作だけではありません。スーパークラスの実装や、フレームワークによって生成されたコードの動作(たとえば、合成アクセサーやKVOの実装に使用される黒魔術)も問題を引き起こす可能性があります。おそらく大丈夫でしょうが、それでも大丈夫ではない可能性は大いにあります。全体として、Appleの推奨事項に従い、直接割り当てるのが最善です。

initでのivarへの割り当ては、適切に機能しているプログラムのリークとして報告されるべきではありません。あなたがそれを見ているなら、あなたが取り組む必要がある他のいくつかの問題があります。問題を最小限のケースに減らして、試してみて、それについて質問してみてください。そうすれば、何が悪いのかを知ることができます。

于 2010-11-23T18:19:06.727 に答える
1

クラスのメソッドに自分allocまたはそれらが含まれている場合は、対応するメソッドでそれらを解放する必要があります。retaininitdealloc

于 2010-11-23T17:16:54.397 に答える
0

「encloseing」クラスがリリースされていないため、そのdeallocメソッドが呼び出されておらず、iVarがリリースされていないと思います。

于 2010-11-23T18:11:49.120 に答える