Почему отправка retainCount в @ "Hi" возвращает -1? - PullRequest
2 голосов
/ 06 января 2010

Метод retainCount должен возвращать целое число без знака.

Почему тогда [@"Hi" retainCount] возвращает -1?

Ответы [ 5 ]

10 голосов
/ 06 января 2010

Простой ответ заключается в том, что, поскольку @"Hi "является строковым литералом, он всегда будет сидеть в двоичном исполняемом образе и никогда не" уйдет ", поэтому сохранение / освобождение не окажет никакого эффекта, и вы видя UINT_MAX (который выглядит как -1 при распечатке со знаком, например, с% d). (См. ответ Пита Киркхэма о объектах NSO, имеющих эту семантику).

Помимо этого, полезно знать, что хотя @ "Hi" ведет себя как NSString*, на самом деле это экземпляр класса CFConstantString, созданный компилятором (или, возможно, NSConstantString, мой отладчик не согласен с некоторой документацией ), который оборачивает литеральные строковые данные и предоставляет вам интерфейс NSString *. Но компилятор знает, что эти строки особенные и не могут быть очищены, поэтому у них всегда будет retainCount UINT_MAX (-1)

6 голосов
/ 06 января 2010

Согласно документации Apple NSObject , он должен возвращать UINT_MAX для объектов, которые никогда не освобождаются. Если вы печатаете UINT_MAX как int со знаком, вы обычно получаете -1, что может быть тем, что вы делаете - как вы выводите значение?

3 голосов
/ 06 января 2010

Никогда не полагайтесь на метод retainCount. Какао делает все виды оптимизации за кулисами, что делает метод retainCount ненадежным и бесполезным. Даже Apple не рекомендует использовать его. Придерживайтесь правил управления памятью, установленных для Какао, и вам никогда не потребуется знать retainCount какого-либо объекта.

0 голосов
/ 06 января 2010

@ "Hello" не требуется для выпуска с кодом,

просто позаботьтесь о том, чтобы объект был создан "alloc" другим без утечки памяти

0 голосов
/ 06 января 2010

Единственная разница между целыми числами со знаком и без знака состоит в том, как вы интерпретируете значение. Если прочитать -1 как целое число без знака, вы обнаружите, что это максимальное значение для целого числа без знака.

Например: NSLog(@"%u", [@"Hello" retainCount]);

Причина, по которой это такое большое значение, в том, что постоянные строковые объекты никогда не освобождаются.

...