0

ウィキペディアの例では、作成者はrelease、オブジェクトstatsが割り当て、コピー、または保持されていないときに、オブジェクトを作成しました。これはエラーですか、それとも私にはわかりませんか?

- (IBAction)analyzeDocument:(NSButton *)sender
{
  dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSDictionary *stats = [myDoc analyze];
    dispatch_async(dispatch_get_main_queue(), ^{
      [myModel setDict:stats];
      [myStatsView setNeedsDisplay:YES];
      [stats release];
    });
  });
}
4

3 に答える 3

2

エラーであるかanalyze、オブジェクトの所有権を呼び出し元に返すことが適切に文書化されています。リリースされたエラーではない場合、そのコード例は、所有権に関するAppleのメモリ管理ルールstatsに反する規則を使用しています。

所有権ポリシーと呼ばれることもあるメモリ管理ルールは、Objective-Cコードでメモリを明示的に管理するのに役立ちます。

作成したオブジェクトは、メモリを割り当てるかコピーすることで所有します。
関連メソッド:alloc、allocWithZone:、copy、copyWithZone:、mutableCopy、mutableCopyWithZone:

所有権を返す必要があるもう1つのプレフィックスは、クラスメソッド+newです。例えば[MyDocClass newAnalysis];

于 2012-06-05T19:49:57.940 に答える
2

これは、GCDが長時間実行されるタスクをバックグラウンドに簡単に配置できることを示すためにJohn Siracusaによって作成された単なる例ですが、はい、2つの問題のいずれかがあります。

架空のanalyzeメソッドが所有参照を返す可能性があります。これは、、、、、または一般的にnew名前allocが付けられていないメソッドがそのような参照を返さないというCocoaの規則に違反していますが、ドキュメントでそれが返されることが明確にされていて、それを回避する方法が実際にない場合は、問題ない可能性があります。この場合、メモリリークを回避するためにに送信する必要があります。(これが実際のコードである場合は、メソッドの名前を変更することをお勧めします。おそらく、所有する参照の戻りを示すためにCoreFoundationで使用されるメソッドを使用します。)releasecopy...releasestatscreate

ただし、analyze慣例に従い、所有されていない参照を返す場合は、その通りです。に送信releaseするのstatsは正しくなく、最終的にはクラッシュが発生します。

于 2012-06-05T19:51:03.617 に答える
1

ほとんどの場合analyze、保持カウントが1の辞書を返すため、releaseが必要になります。

于 2012-06-05T19:52:11.433 に答える