0

次のように、別のスレッドの別のオブジェクトのメソッドに渡されるオブジェクトを作成するオブジェクトのメソッドがあります。

MyClass* myClass = [[MyClass alloc] init];
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO];

メソッドでは、オブジェクトが作成者によって何らかの形で解放されると仮定して、オブジェクトをすぐに保持します。私の質問は: MyClass がそのオブジェクトを正しく解放するにはどうすればよいですか? これは正しい方法ですか?

私の解決策は、メソッドでオブジェクトを手動で解放することでした。とにかく、Leak アナライザーがまだこれをリークとして認識しており、所有者がオブジェクトを解放する責任があるため、Apple が推奨しているものではないようです。

この状況を処理する正しい方法を説明してもらえますか? ありがとう!

4

2 に答える 2

9

あなたが達成しようとしていることを完全には理解していませんが、一般的には次のとおりです。

誰がいつオブジェクトを解放/割り当て解除するかについて心配する必要はありません。代わりに、あなた(あなたの単一のオブジェクトまたはメソッド) がそれを必要とし始めたときにそれを保持し、必要がなくなったときにそれを解放するようにしてください(または自動解放します。この場合、autorelease を呼び出したスレッドで解放されます)。 )。

これはまさにそのperformSelectorOnMainThread:withObject:waitUntilDone:仕組みです。ドキュメントから:

このメソッドは、セレクターが実行されるまでレシーバーと arg パラメーターを保持します。

仕事をするためにそれらが必要な間、それらを保持します。

つまり、オブジェクトを作成して別のスレッドに送信するメソッドは次のようになります。

MyClass* myClass = [[MyClass alloc] init]; // retained, will need it for performSelector
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO];
[myClass release]; // no longer needing it.

また

MyClass* myClass = [[[MyClass alloc] init] autorelease]; // will be released automatically, but guaranteed to be retained until this method returns
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO];

あなたが今持っている方法はメモリリークです。

受け取り方法:

  • オブジェクトを内部でのみ使用する場合は、performSelector「実行後まで」(メソッドが戻るまで) 保持する必要がないため、保持する必要はありません。
  • 後で必要になった場合は、それを保持するプロパティに割り当てる必要があります。
于 2011-01-08T11:37:36.630 に答える
0

このオブジェクト、そのオブジェクト、別のオブジェクトについて話し、myClassanotherClass、およびmethodなどの意味のない名前を使用しているため、質問を理解するのは非常に困難です。どのオブジェクトを解放しようとしていて、どのオブジェクトがリークしていると報告されているかは不明のままです。

とにかく、マルチスレッドは参照カウントに特別な複雑さを追加しません。確かに、myClassanotherClassという 2 つのオブジェクトは短命のオブジェクトではありません。そのため、autorelease を使用する場合は、すべての autorelease が実行された場合に参照カウンターが 0 にならないようにしてください。

methodでmyClassまたはanotherClass、あるいはその両方を解放しても問題ありません。

多くのコードを表示しません。しかし、あなたが示すものは大丈夫です。

于 2011-01-08T11:33:49.790 に答える