11

これは SO 内で既に回答されている質問ですが、Apple のドキュメントのどこにも見つかりません。正しい方向に私を向けることができますか?

以下のトピック内

オブジェクトを -performSelector:withObject:afterDelay: に渡す前に保持する必要がありますか?

performSelector:withObject:afterDelay:inModes の保持カウントへの影響

performSelector:withObject:afterDelay を呼び出すオブジェクトは NSRunLoop によって保持されますか?

デフォルトの動作は次のようです。レシーバーと引数を保持します

次のコードを使用しています

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData];

userData自動解放されたオブジェクトです。

保持カウントをログに記録します (それを行うのは有効ではない可能性があることはわかっています) 渡されたデータは、その保持カウントをインクリメントします。メソッドがデリゲートで呼び出されると、保持カウントは 1 に等しくありません。

それで、私の質問は次のとおりです。リークを避けるためにメモリ管理を実行する必要がありますか、それとも Apple のものを信頼する必要がありますか? ここでは、適切なドキュメントが見つからないため、不可知論者として話しています。

前もって感謝します。

4

2 に答える 2

11

ドキュメントで間違った関数を見ています。

保持

performSelector:withObject:afterDelay:および同様の関数 ( with afterDelay ) は、後で実行されるため、レシーバーと引数を保持します。

保持なし

performSelector:withObject:同様の関数 ( without afterDelay ) は、関数を直接呼び出すだけなので、何も保持しません。

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData];

とまったく同じことをします

[[self delegate] tryToSendStoreData:userData];
于 2012-06-27T17:56:16.683 に答える
11

@newacct は正しい答えを出しましたが、@Flex_Addicted が尋ねた質問、つまり観察された動作が実際に保証されているという Apple のドキュメントからの引用ではありませんでした。以下は(部分的な)引用ですが、そこにたどり着くにはいくつかのフープを通過する必要があります-

performSelector:withObject:afterDelay:のドキュメントには、次のように記載されています

このメソッドは、現在のスレッドの実行ループで aSelector メッセージを実行するタイマーを設定します。

次に、のドキュメントに移動すると、実行ループで何かをキューに入れる機能を許可するメソッドが 1つNSRunLoopだけ存在することがわかります
。 performSelector:target:argument:order:modes:

このメソッドは、次の実行ループ反復の開始時に、現在のスレッドの実行ループで aSelector メッセージを実行するタイマーを設定します。タイマーは、modes パラメーターで指定されたモードで実行するように構成されています...レシーバーは、セレクターのタイマーが起動するまでターゲット オブジェクトと anArgument オブジェクトを保持し、その後、クリーンアップの一部としてそれらを解放します。

もちろん、 が[NSObject performSelector:withObject:afterDelay:]常に使用されることを保証するものは何もありません[NSRunLoop performSelector:target:argument:order:modes:](ただし、誰かがそのドキュメントを思い付くことができれば、この回答は完全になります) が、少なくともこれは、聖典が私たちをなぞなぞにする謎に答える謎への一歩です。

于 2012-10-19T07:53:36.403 に答える