2011-08-15 13 views
1

私はいくつかのよく知られていないObjective-cメモリ管理コードを実行しました。Objective-cオブジェクト解放パターン

// no property declared for myMemberVariable in interface 
id oldID = myMemberVariable; 
myMemberVariable = [MyMemberVariable alloc] init]; 
[oldID release]; 

と::

// (nonatomic, retain) property is declared for myMemberVariable in interface 
self.myMemberVariable = [[MyMemberVariable alloc] init]; 

感謝の違いは何です!

答えて

4

2番目は技術的には間違っていますが、最初はおそらくObjective-C 2.0のプロパティ構文をまだ採用していない人がいます。 OS Xの長年の開発者(または長時間のNextStep/OS X開発者)であれば、比較的最近に追加されたので、使用しない人には利益や利益を得ることなくそれを使用しない人がいます。

だから、最初は基本的に同じである:

// this'll be retained by the setter, so we don't want to own what we pass in 
self.myMemberVariable = [[[MyMemberVariable alloc] init] autorelease]; 
3

最初の例では、インスタンス変数があります。 2番目の例では、自動メモリ管理属性を持つプロパティです(retainで示されます)。

最初の例では、オブジェクトをインスタンス変数に割り当ててから解放します。明示的にリリースしていないので、以前に割り当てられたオブジェクトも漏れているように見えます。 (おそらく、それは自動リリースされている、ここで伝えることはできません)。

2番目の例では、オブジェクトを割り当てて、そのオブジェクトを保持しているプロパティに割り当てます。つまり、明示的にリリース/自動解放しない限り、リークすることになります。

self.myMemberVariable = [[[MyMemberVariable alloc] init] autorelease]; 

または

MyMemberVariable *m = [[MyMemberVariable alloc] init]; 
self.myMemberVariable = m; 
[m release]; 

それはあなたが自由のために(ほとんど)メモリ管理を取得してプロパティを使用するためにはるかに良いです。たとえば、新しいものを割り当てる前に参照を解放することについて心配する必要はありません。

1

最初の形式はありません:あなたはプロパティを「保持」、セッターとの正しいバージョンがあるべき持っていることを考えれば

[myMemberVariable release]; 
myMemberVariable = [[MyMemberVariable alloc] init]; 

プロパティを使用しません。古い値は間違いなく新しいものと同じではありませんので

[myMemberVariable release]; 
myMemberVariable = [[MyClass alloc] init]; 

、それが再び保持させることができる前に、古い値が解放されないチャンスがありません:私は何をするではない十分な理由が表示されません。

プロパティは、新しいコンパイラでコンパイラによって合成され、正しいものを実行するという利点があります。つまり、型を保持する必要がある場合は、新しい値を保持し、古い値を解放する方法を知っています。またはコピーされます。 int、floatなどの型は単純な値型なので、これは必要ではありません。

つまり、自己または他のオブジェクトのドット表記を使用すると、プロパティにアクセスし、実際に割り当ての方向に応じてgetterメソッドまたはsetterメソッドを呼び出します。

ivar(メンバー変数)に直接アクセスすると、プロパティから保護されず、自分自身を保持/解放する必要があります。

また、独自のセッターとゲッターを書くこともできます。次に、それが適用されるメモリ管理も行う必要があります。しかし、それはあなたにもっと柔軟性を与えます。アイテムをログに記録したり、入力の有効性をチェックしたり、内部状態変数を更新したりすることができます。

関連する問題