2012-03-30 8 views
4
NSArray *arr=[[NSArray alloc]init]; //Am getting all immutable objects allocation that retain count:2 
NSLog(@"dic1:%d",[arr retainCount]); 
[arr retain]; 
[arr retain]; 
[arr retain]; 
[arr release]; 
NSLog(@"dic2:%d",[arr retainCount]); 


NSMutableDictionary *dic=[[NSMutableDictionary alloc]init];//Am getting all mutable objects allocation that retain count:1 
NSLog(@"dic3:%d",[dic retainCount]); 
[dic retain]; 
[dic retain]; 
[dic retain]; 
[dic release]; 
NSLog(@"dic4:%d",[dic retainCount]); 

OUTPUT:dic1:2 dic2:4 dic3:1 dic4:?3オブジェクトcの変更可能で不変なオブジェクトの数を保持していますか?

変更可能なオブジェクト間の差分は、カウントを保持し、不変オブジェクトがカウント保持されているものplsは私に解決策を与える...

+0

retainCountは役に立たない。それを気にしないでください。 – bbum

答えて

0

オブジェクトの内部実装にはretainが含まれている可能性がありますので、retainCountメソッドを使用しないでください。retainとシステムのretainがあります。

6

あなたが次の行

NSLog(@"%p %p %p", [NSArray new], [NSArray new], [NSArray new]); 

を追加した場合、あなたはすべてのポインタ値が同じであることがわかります(ともdic1の初期値は3で上がったし、今5で始まります)。つまり、[[NSArray alloc] init]は実際には何も割り当てずに、常に生きているシングルトンを保持して返します。

は、retainCountの値に依存します。これは、オブジェクトがランタイムとフレームワークによって内部的に保持されるためです。一部のオブジェクトではカウンタを保持することさえできないことがあります。これはまた、releaseが予想通りに割り当てを解除すると予想してはならないことを意味します。

+0

あなたは先生、私を悟りました。そのような配列をキャッシュすることは知らなかった。 –

関連する問題