Странное поведение с retainCount - PullRequest
2 голосов
/ 01 марта 2011

Когда я веду журнал учета количества объектов NSArray и NSString, я веду себя неравномерно. См. Код ниже,

NSArray *aryTemp = [NSArray arrayWithObjects:@"One",nil];
NSLog(@"Retain Count :%d",[aryTemp retainCount]);

NSArray *aryTemp2 = [[NSArray alloc] initWithObjects:@"One",nil];
NSLog(@"Retain Count :%d",[aryTemp2 retainCount]);

NSString *strTemp = @"One";
NSLog(@"Retain Count :%d",[strTemp retainCount]);

NSString *strTemp2 = [[NSString alloc] initWithString:@"One"];
NSLog(@"Retain Count :%d",[strTemp2 retainCount]);

И это вывод, который я получаю

2011-03-01 19:19:32.410 Test[14607:207] Retain Count :37
2011-03-01 19:19:32.412 Test[14607:207] Retain Count :1
2011-03-01 19:19:32.413 Test[14607:207] Retain Count :2147483647
2011-03-01 19:19:32.413 Test[14607:207] Retain Count :2147483647

Что не так с кодом??

Спасибо

Пратик Госвами

Ответы [ 4 ]

7 голосов
/ 01 марта 2011

нет ничего плохого с 2147483647

2147483647 - INT_MAX.А INT_MAX - это дополнительный счет для строковых литералов (т.е. строк @ "foo", определенных в вашем коде).Это означает, что они никогда не будут выпущены.

кстати, не используйте retainCount.

6 голосов
/ 01 марта 2011

Вы никогда не должны использовать -retainCount, потому что это никогда не говорит вам ничего полезного.Реализация платформ Foundation и AppKit / UIKit непрозрачна;вы не знаете, что хранится, почему оно сохраняется, кто его хранит, когда оно было сохранено и т. д.

См. также: StackOverflow |когда использовать retainCount для превосходного пересчета причин, по которым вы не используете retainCount.

И чтобы повторить Дейва Делонга: Пожалуйста, все перейдите на http://bugreport.apple.com и попросите об исключении -retainCount,Чем больше людей просят об этом, тем лучше.

4 голосов
/ 01 марта 2011

Что не так с кодом ??

Вы вызываете retainCount.

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

4 голосов
/ 01 марта 2011

retainCount возвращает NSUInteger, и вы должны напечатать его следующим образом ...

NSLog( @"%lu", (unsigned long)[blabla retainCount] );

% d используется для 32-разрядного целого числа со знаком (int). NSUInteger на 32-битной платформе определяется как unsigned int, а на 64-битной платформе - как unsigned long. Верхний пример безопасен для 32/64-битных платформ.

...