сохранить счет для изменчивого и неизменного объекта в цели c? - PullRequest
4 голосов
/ 30 марта 2012
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]);

ВЫХОД: dic1: 2 dic2: 4 dic3: 1 DIC4: 3

Что такое разница между изменяемыми объектами, сохраняющими счет и неизменяемыми объектами, сохраняющими счет? Просьба дать мне решение ...

Ответы [ 2 ]

6 голосов
/ 30 марта 2012

Если добавить следующую строку

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

тогда вы заметите, что все значения указателей одинаковы (а также что начальное значение dic1 увеличилось на три и теперь начинается с 5). Это означает, что [[NSArray alloc] init] на самом деле ничего не выделяет, а просто сохраняет некоторый всегда живой синглтон и возвращает его.

Никогда полагается на значение retainCount, поскольку объект может быть внутренне сохранен средой выполнения и средами. Некоторые объекты могут даже не иметь счетчика сохранения. Это также подразумевает, что вы не должны ожидать, что release будет предсказуемо вызывать освобождение.

0 голосов
/ 30 марта 2012

Никогда не используйте метод retainCount, потому что он никогда не дает реальных значений, потому что внутренняя реализация объекта может содержать retain s, поэтому у вас будет retain s и retain s системы.

...