AppleのMemory Management Programming Guideには、オブジェクト参照を保持または解放する必要のあるアクセサーメソッドを作成するための3つの公認技術が示されています。これらのメモリ管理技術は、どのような状況で優れていますか?
最初の2つのテクニック(下に再現されています)の場合、アップルのドキュメントによれば、「getterがセッターよりも頻繁に呼び出される場合、テクニック2のパフォーマンスはテクニック1よりもかなり優れています"
// Technique 1
- (NSString*) title
{
return [[title retain] autorelease];
}
- (void) setTitle: (NSString*) newTitle
{
if (title != newTitle)
{
[title release];
title = [newTitle retain]; // Or copy, depending on your needs.
}
}
// Technique 2
- (NSString*) title
{
return title;
}
- (void) setTitle: (NSString*) newTitle
{
[title autorelease];
title = [newTitle retain]; // Or copy, depending on your needs.
}
が、これは技術1と手法2との唯一の違いです、または他の上の1つは、私が意識する必要がありますそれらの他の微妙な影響を持って使用していますか?そして、テクニック2がより良い実行ゲッターを使用している場合は、title
が明示的(そしておそらくは即時)のリリースを取得するので、テクニック1はより良い実行セッターを使用しますか?
deallocメソッドが正しくアクセサを通じて変数をクリアした場合、第二の技術は、タイトルが自動解放されるため、クラッシュを引き起こす、としません新しいタイトルが異なると、セカンドセッターがより速くなります。古いタイトルはすぐにリリースされないので、より多くのメモリを使用します。 – ughoavgfhw
@ughoavgfhw:deallocでアクセサを使用するのは適切ではありません.Appleや、ほとんどのCocoaプログラマーが実際に悪い習慣と考えています。 – Chuck
@chuckテクニック1からゲッターにアクセスしてから解放すると、クラッシュが発生します。 – Remover