2011-02-04 8 views
0

以下の2つのパターンを使用してビューを作成しました。(iphone)基本的なメモリ管理の質問

@property (retain, nonatomic) SomeView* someView; 

... 

// First pattern 
self.someView = [[SomeView alloc] initWithFrame frame]; 

// Second pattern 
SomeView* aSomeView = [[SomeView alloc] initWithFrame]; 
self.someView = aSomeView; 
[aSomeView release]; 

さて、このコードを振り返ってみると、第一のパターンの方法は

self.someView = [[[SomeView alloc] initWithFrame frame] autorelease]; 

それいけないに変更する必要がありますか?

私はダム感じ:(

+1

はい、ビューを1で自動解放するか、メモリリークが発生する可能性があります。愚かなことを感じないでください。何か新しいことは学び理解するのに時間がかかります。 –

+0

まず、いくつかのコロンを省略します。例えば、 'initWithFrame:frame'でなければなりません。第二に、私はinitWithFrameがパラメータを必要としていると推測しています。したがって、2番目のパターンは実行時にコンパイラの警告とクラッシュを引き起こします。 –

+0

@Jason:あなたのコメントを答えにしてみませんか? –

答えて

1

ルック:

[[SomeView alloc] initWithFrame: frame]; 

は、上記の行は、オブジェクトを作成し、それをの保持カウントを与えますsomeViewプロパティがで宣言されているので、1

self.someView = [[SomeView alloc] initWithFrame: frame]; 

は、このラインは、2の保持カウントでそれを残し保持:それをやってそう

@property (**retain**, nonatomic) SomeView* someView; 

を、この方法は、オブジェクトを指してあなたのsomeViewプロパティを去りますあなたはそれに自動放棄の呼び出しを追加すると、このようにすることができます:

self.someView = [[[SomeView alloc] initWithFrame: frame] autorelease]; 

あなたが私に尋ねると、あなたの2番目のパターンが良いです。保持カウントが1のオブジェクトを作成します。これをretainプロパティに代入し(今はretain countが2です)、元の変数を解放して、retain countを1にしてオブジェクトを再び残します。これは3行で1つしかないかもしれませんが、意味があります適切な文脈でさらに、通常は、Obj-Cのメモリ管理を完全に理解していないことを示すため、allocやcopyメソッド以外のautoreleaseの使用は避けるのが最善です。

コメント者が質問へのコメントで言ったように、気が気にしないでください。これは最初は直感的ではありません。誰もギターを拾わず、初めてヘンドリックスのように演奏する。

0

はい、あなたは正しいです。autoreleaseは「少し後解放」を意味します。

0

はい、私はあなたがそれを変更すべきだと思う。あなたが増加セッターを呼び出しているself.someView =付き。このようなことで、カウントを保持

0

このコードを見ると、1のメソッドはself.someView = [[[SomeView alloc] initWithFrame frame] autorelease]に変更する必要があります。 そうではありませんか?

正しい

A)

SomeView * view = [[SomeView alloc] initWithFrame:frame]; 
self.someView = view; 
[view release], view = nil; 

B)

self.someView = [[[SomeView alloc] initWithFrame:frame] autorelease]; 

多くの人々はそれを入力する小さいという理由だけで、Bを好みます。

私が理由と同様のアプローチを好む:(例えばオーバー放出など)

  • 欠陥は、多くの場合、呼び出しサイトの近くにさらされている、プールが破壊されたとき(これは多くの場合、あなたがロードしなければならないことを意味するのではなくゾンビモードの楽器呼び出し場所を見つけるために)
  • までそれがパフォーマンスが向上し、メモリ使用量を最小限に抑える(この特定のケースでは一般的には、あまりない)
  • 無効な状態をチェックするためのより多くの機会を持っていて、
  • 結果初期化/設定するチャンスがある