2012-02-01 4 views
1

Вот мой кодСтранная сохранить счетчик вновь созданного объекта строки

#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 Becase он вновь созданный объект, но результат 1152921504606846. Что здесь не так?

+0

Не используйте saveCount. См. [Когда использовать -retainCount?] (Http://stackoverflow.com/questions/4636146/when-to-use-retaincount) – beryllium

+0

Возможный дубликат [NSString keep Count] (http://stackoverflow.com/questions/1390334/nsstring-keep-count) –

ответ

6

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

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

Я согласен с вами, но почему большинство книг об объекте-c используют метод keepCount для объяснения управления памятью? – Profo

+2

Не знаю. Вы должны спросить авторов. –

+0

LOL, спасибо за ответы :) – Profo

-2

Просто измените% лу в% г

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; 
} 
+0

Итак, какой результат показывает ваш код?) – beryllium

+3

1) 'retainCount' возвращает' NSUInteger', поэтому '% lu' является правильным спецификатором. 2) Вы никогда не должны оценивать 'keepCount'. 3) Поскольку в этом случае 'NSString' просто оптимизирует себя и возвращает константу * constant (unreleaseable)' @ "Это строковый объект« вместо нового объекта, который таким образом возвращает очень большое число для 'keepCount' , – DarkDust

1

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

Первый не в autorelease бассейне, но в вашем 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 (что означает, что они не могут быть dealloc'd).

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

Смежные вопросы