1

私はオブジェクトを持っています

id currentObject;

通知を通過させたいです。問題は、それを正しくリリースする方法がわからず、メモリ管理のドキュメントが私を夢中にさせていることです。

私は今このようにやっています:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[currentObject copy], @"key", nil]];
[currentObject release];

むしろそうすべきです:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[currentObject autorelease], @"key", nil]];

(iPhone、iOS4.0用です)

前もって感謝します!

4

2 に答える 2

1

どちらの方法でもOKです。これら2つのアプローチにはわずかな違いがありますが、この場合、実際的な違いはありません。何らかの方法で自分の所有権を解放している限り、問題はありません。辞書と通知センターは、自分の所有権の問題を自分の時間で処理します。

編集:おっと、何かを逃した。私が最初に言ったことはまだ一般的に当てはまりますが、最初の例ではあなたが求めcopyているものcurrentObjectです。これにより、新しい所有権が作成されます。これはすぐに忘れてしまうため、メモリリークが発生します。

どこで作成したかわからないのでcurrentObject、両方のバージョンがそれをオーバーリリースする可能性もあります。しかし、あなたがそれを仮定するallocと、あなたはそれを十分に解放しています。しかし、電話をかけることを主張する場合(おそらく不要ですが、それが何であり、後で何が起こるかについてはcopyもっと知っているでしょうが)、たとえば、電話を次のようにラップすることによって、新しいコピーも必要です。currentObjectreleasecopyautorelease

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[[currentObject copy] autorelease], @"key", nil]];
[currentObject release];

これが不明な場合は、オブジェクトの所有権に関するドキュメントをもう一度よく読んでください。

于 2010-07-08T14:27:30.653 に答える
0

ドキュメントに別段の記載がない限り、渡されたオブジェクトの所有権の問題を整理するために、渡されたオブジェクトを想定できます。たとえば、NSNotificationCenterドキュメントの概要の一番下までスクロールすると、オブザーバーが保持されていないという事実についての呼びかけがあります。

オブジェクトのコピーを-copyによって作成されたディクショナリに渡すため、最初の例がリークします。したがって、オブジェクトとコピーの両方を所有しますが、コピーを解放することはありません(ディクショナリもコピーを保持します)。ディクショナリにオブジェクト自体ではなくオブジェクトのコピーを含める場合は、次のようにします。

[[NSNotificationCenter defaultCenter] 
    postNotificationName:@"MessageReceived" 
                  object:nil 
                userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[[currentObject copy] autorelease], @"key", nil]];

2番目の例は、currentObjectを所有している場合、つまり、new、alloc、またはコピーを含むメソッドで取得した場合、または以前に保持している場合は問題ありません。

于 2010-07-08T15:43:08.900 に答える