2012-02-22 6 views
-1

こんにちは私は次の問題に関する質問があります。プロパティ(保持)プロパティを使用するときの動作を保持

私は2つのオブジェクト:aClassとbClassを持っています。 aClassには、retainプロパティを使用してbClassが含まれます。 bClassをインスタンス化した後(私はここでミスの問題を解決したいので、私はここで便利なアロケータを使いません)、aClassのsetPropertyを使ってbClassをaClassに割り当てます。

プロセス全体を通して、参照を要求してaClassのプロパティを確認することによって、bClassのretainCountをチェックします。

私が理解している限り、Objective Cのメモリ管理は、プロパティと参照の間でオブジェクトの所有権を共有しているため、前述の保持カウントは同じにする必要があります。

私にはメモリ管理を理解する上で大きな問題があるようです。多分誰かが私の間違いを私に説明することができます。 Thxを事前に入力してください。

Header of ClassA 

@property (retain)ClassB *myProperty; 


Source of ClassA 

@implementation ClassA 
-(id)init { 

self = [super init]; 

if (self) { 
    ClassB * bClass = [[ClassB alloc] init]; 
    NSLog(@"Temporary bClass retain count = %d", [bClass retainCount]); 

    self.myProperty = bClass; 
    NSLog(@"retain count after giving ownership to ClassA = %d", [bClass retainCount]); 

    [bClass release]; 
    NSLog(@"retain count of bClass after release = %d", [bClass retainCount]); 
    NSLog(@"retain count of myProperty of ClassA = %d", [self.myProperty retainCount]); 
} 
return self; 
} 

出力は次のとおり

一時bClassカウント= 1

= 2

A級に所有権を与えた後カウントを保持が解除= 1

後bClassのカウントを保持する保持しますClassA = 2のmyPropertyの保持カウント

+0

'-retainCount'は使用しないでください。これは有用ではありません:http://stackoverflow.com/questions/4636146/when-to-use-retaincount – newacct

答えて

2

オブジェクトインスタンスは保持され、解放されます。オブジェクトインスタンスへのポインタはオブジェクトではなく、それら自体は保持されたり解放されたりしません。

最初に、BCLassというポインタがBCLassのインスタンスを指しています。このインスタンスは、initを呼び出すと保持されます。 (保持カウント= +1)

次に、プロパティセッターsetMyPropertyで別のポインターを割り当てます。プロパティはretsain属性と結合されているので、BClassのインスタンスは再び保持されます。 (保持カウント= +2)

次に、bClassが指し示すBClassのインスタンスでreleaseを呼び出します。 (これはBClassの同じインスタンスで、myPropertyプロパティが指し示すものです(Count = 1を保持します。)

アトミック属性を使用していないの効果が文書から見ることができます。合成されたアクセサは、マルチスレッド環境でのプロパティ への堅牢なアクセスを提供するよう

プロパティは、デフォルトではアトミックですgetterから返された値またはsetterを介して設定された値は、他のスレッドが同時に実行しているものとは無関係に、常に完全に取得または設定されます( )。

あなたが強く、コピーを指定するか、または保持し、アトミック指定しない場合は、参照カウント 環境で、オブジェクトのプロパティのために合成getアクセサがロックを使用し、保持し、 が返された値-実装を自動解放次のようになります。

[_internal lock]; // lock using an object-level lock 

id result = [[value retain] autorelease]; 

[_internal unlock]; 

return result; 

だから、声明をロギングあなたのように見えるオブジェクトを保持します(= 2を保持)し、自動解放プールに格納されますプロパティを参照します。

所有権とは、オブジェクトを解放するためにその所有者が必要としなくなったことをオブジェクトに伝える責任を負うことを単に意味します。 、Init、Retain、Cop​​y)

+0

ありがとう、これは多くの助けになりました! – user1214249

+0

"initを呼び出すと、そのインスタンスは保持されます。「alloc」を呼び出すと、そのインスタンスは実際に保持されます。 'init'は概念的に保持カウントを変更しません – newacct

2

retainCountは役に立たない。それを呼び出さないでください。

特に、オブジェクトがオートリリースされたかどうかを反映することはできず、ゲッターメソッドが呼び出されたときにオブジェクトが保持されるか、または自動的に解放されます。

+0

対応するゲッターが呼び出された場合にオブジェクトを自動解放する(保持する)のですか?これは原子とは何の関係もないと思いました プロパティの使用が正しいと思いますか?retainCountを使用したにもかかわらずですか? – user1214249

+0

実装デタil;原子プロパティは/ autoreleaseを取得し、非原子は保持しません。そして、はい、その例でのbClassの使用は漏れません。 – bbum

+0

@ user1214249:getter/setterプロパティは、それが気に入ったら5回保持して自動解放できます。あなたはそれに頼ることはできません。 retain/autoreleaseを追加すると、コードの正確性が低下することはありません。したがって、どのような関数も、豊富な注意から、必要なだけ自由に使用することができます。 – newacct

1

あなたが覚えておく必要があるのは、それを割り当て、コピーまたは新規作成した場合、オブジェクトの所有権を取得してから解放する必要があることです。私はretainCountの値について心配しません。

関連する問題