2011-01-08 13 views
4

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はより良い実行セッターを使用しますか?

答えて

0

2番目のゲッターは壊れやすい(誰かがオブジェクトのtitleにアクセスしてオブジェクトを解放するとクラッシュします)ので、少し遅い場合でも最初の方が一般に好ましいです。

最初のセッターは、より効率的で、自動解放プールが存在しない状況でも機能するため、これが望ましいです。それがより効率的である理由は、自動解放対リリースのためだけではなく、プロパティを既存の値に設定しようとすると、何の仕事もしません。

+0

deallocメソッドが正しくアクセサを通じて変数をクリアした場合、第二の技術は、タイトルが自動解放されるため、クラッシュを引き起こす、としません新しいタイトルが異なると、セカンドセッターがより速くなります。古いタイトルはすぐにリリースされないので、より多くのメモリを使用します。 – ughoavgfhw

+0

@ughoavgfhw:deallocでアクセサを使用するのは適切ではありません.Appleや、ほとんどのCocoaプログラマーが実際に悪い習慣と考えています。 – Chuck

+0

@chuckテクニック1からゲッターにアクセスしてから解放すると、クラッシュが発生します。 – Remover

1

2からゲッターと1からセッター:

- (NSString*) title 
{ 
    return title; 
} 

- (void) setTitle: (NSString*) newTitle 
{ 
    if (title != newTitle) 
    { 
     [title release]; 
     title = [newTitle retain]; // Or copy, depending on your needs. 
    } 
} 
関連する問題