retainCount показывает MaxInt - PullRequest
       1

retainCount показывает MaxInt

6 голосов
/ 08 сентября 2011

После попытки напечатать retainCount объекта я получаю 2147483647. Почему я получаю такой результат? Это должно быть 1, не так ли?

NSString *myStr = [NSString new];
NSUInteger retCount = [myStr retainCount];
NSLog(@"refCount = %u", retCount);

2011-09-08 17: 59: 18,759 Тест [51972: 207] refCount = 2147483647

Я использую XCode версии 4.1. Пробовал компиляторы GCC 4.2 и LLVM GCC 4.2 - тот же результат. Параметр «Сборка мусора» был установлен как неподдерживаемый.

Ответы [ 4 ]

15 голосов
/ 08 сентября 2011

NSString является чем-то особенным, когда дело доходит до управления памятью. Строковые литералы (что-то вроде @"foo") по сути являются одиночными, каждая строка с одинаковым содержимым - это один и тот же объект, потому что он все равно не может быть изменен. Поскольку [NSString new] всегда создает пустую строку, которая не может быть изменена, вы всегда получите тот же экземпляр, который не может быть освобожден (таким образом, высокий retainCount).

Попробуйте этот фрагмент:

NSString *string1 = [NSString new];
NSString *string2 = [NSString new];
NSLog(@"Memory address of string1: %p", string1);
NSLog(@"Memory address of string2: %p", string2);

Вы увидите, что обе строки имеют один и тот же адрес памяти и, следовательно, являются одним и тем же объектом.

12 голосов
/ 08 сентября 2011

Это не дает прямого ответа на ваш вопрос, но retainCount на самом деле не так уж полезен и не должен использоваться для тестирования.Смотрите этот пост так подробно. Когда использовать -retainCount?

4 голосов
/ 08 сентября 2011

Хотя NSString и являются странным случаем (есть и другие в платформе), вы также можете столкнуться с этим в других предложениях - это один из способов создания одноэлементного объекта.

Синглтон существует только один раз вприложение, и очень важно, что оно никогда не выйдет!Следовательно, он перезапишет некоторые методы NSObject, включая (но не ограничиваясь ими):

- (id)release {
    // Ignore the release!
    return self;
}

- (NSUInteger)retainCount {
    // We are never going to be released
    return UINT_MAX;
}

Этот объект никогда не может быть освобожден и сообщает платформе, что это одиночный объект, с невероятно высоким счетом удержания.

Оформить заказ эта ссылка для получения дополнительной информации об одноэлементных объектах.

1 голос
/ 08 сентября 2011

Я видел это пару раз в отношении NSStrings, retainCount возвращает максимальное количество вместо действительного, когда вы пытаетесь таким образом посмотреть на retainCounts для строк.

Попробуйте это;

NSString *myStr = [[NSString alloc] init];
NSUInteger retCount = [myStr retainCount];
NSLog(@"refCount = %u", retCount);

Редактировать: Восстановленный NSUInteger

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...