Странно сохранять количество вновь созданных строковых объектов - PullRequest
1 голос
/ 01 февраля 2012

Вот мой код

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *str = [[NSString alloc]initWithString:@"This is string object"];
    NSLog(@"%lu", [str retainCount]);
    [pool drain];


    return 0;
}

Я ожидал, что результат будет 1, потому что это вновь созданный объект, но результат - 1152921504606846. Что здесь не так?

Ответы [ 3 ]

6 голосов
/ 01 февраля 2012

Три важных момента:

  1. Это не имеет ничего общего с пулами автоматического выпуска. Ваша переменная alloc d, поэтому она не добавлена ​​в пул
  2. Никогда не используйте retainCount для отладки. См. Ответы на этот вопрос
  3. Ваша строка фактически является константой, поэтому счетчик сохранения равен , вероятно MAX_INT. Но вы не должны полагаться на это
1 голос
/ 01 февраля 2012

Посмотрите, что бериллий сказал выше;) Никогда не используйте -retainCount Тем не менее, здесь есть две проблемы:

Первая не в пуле автоматического выпуска, но в вашем NSLog.

-[NSObject retainCount] возвращает NSUInteger, который имеет ширину 32 или 64 бита, в зависимости от архитектуры системы.Рекомендуется всегда приводить значения NSInteger к (long) и значения NSUInteger к (unsigned long), когда функция принимает переменное число аргументов.Следовательно:

NSLog(@"%l", (long)[str integerValue]

или

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

Вторая - это оптимизация: @ «Это строковый объект» на самом деле является строкой NSString, но специальной NSString, называемой NSCFConstantString, котораяимеет счет сохранения NSIntegerMax (что означает, что они не могут быть освобождены).

Я только что запустил ваш оригинальный пример, и похоже, что строка NSString, инициализированная с помощью -initWithString:, возвращает исходную строку.В данном случае это постоянная строка, поэтому она возвращает NSIntegerMax.

0 голосов
/ 01 февраля 2012

Просто измените% lu на% d

int main (int argc, const char * argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *str = [[NSString alloc]initWithString:@"This is string object"];
    NSLog(@"%d", [str retainCount]);
    [pool drain];


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