2009-09-07 2 views
5

Всего пару дней я работал над проектом, и мне нужно посмотреть, что удерживает счет строки.NSString keep Count

Но он всегда возвращает мне «2147483647», почему это так?

Проверьте этот код, чтобы проверить это самостоятельно.

NSString *str = [[NSString alloc] initWithString:@"Hello World"]; 
NSLog(@"String Retain Count: %i", [str retainCount]); 

Так что мой вопрос, почему он не возвращается 1, как вернуть другие объекты, почему я получаю «2147483647»

Спасибо заранее.

+0

Почему это сообщество wiki? –

+0

Очень жаль, если я нажму где-нибудь, где я не должен, новичок на этом сайте, поэтому действительно не знаю, что это значит, извините. – itsaboutcode

+0

Не волнуйся. Это прекрасно, чтобы сделать его вики-сообществом. – Chuck

ответ

24

Компилятор умнее вас.

Он видит @"Hello world" и думает: «Ага! Постоянная строка!»

Затем он видит [[NSString alloc] initWithString:@"Hello world!"] и думает «Ага! Постоянный объект, созданный с помощью постоянной строки!».

Затем он сворачивает оба из них в один NSConstantString, который имеет retainCountUINT_MAX, так что он никогда не может быть выпущен.

+0

Хорошо, можете ли вы рассказать мне, как я получу счет сохранения 1, в случае NSString? – itsaboutcode

+2

@itsaboutcode Я бы порекомендовал не думать об этом с точки зрения keepCounts, а вместо этого подумайте о том, «я выделил эту строку, поэтому я должен ее освободить», и пусть saveCounts сортируются самостоятельно. За несколько лет, которые я писал в Objective-C, я не могу придумать ни одного экземпляра, когда я вам нужно будет работать с keepCount.Если вы будете следовать правилам управления памятью, все будет в порядке. –

+0

@ Dave DeLong Вот как я думал, если создал объект с NSString * str = [[NSString alloc] initWithString: @ "Hello World"]; Тогда я должен отпустить его, не так ли? Но если я должен его выпустить, я должен знать, что это за сохранение счета? В противном случае я буду отправлять сообщения объекту, которого нет, и результатом будет то, что моя программа сработает! – itsaboutcode

2

Строка оптимизируется во время компиляции до статически распределенного экземпляра NSString, чтобы сэкономить на некоторых накладных расходах переменных и т. П. Вы видите такой высокий показатель удержания, потому что статические строки имеют показатель удержания максимального целого числа на любой платформе, на которой вы разрабатываете.

2
NSString *str = [[NSString alloc] initXXX 

обычно выделяет некоторую ОЗУ и возвращает указатель. Тогда эта оперативная память будет подвержена выбросам и повторению. Тем не менее, когда вы делаете:

NSString *str = [[NSString alloc] initWithString:@"Hello World"]; 

возвращаемая строка @ «Hello World», который уже выделен, поскольку он был строковым. Поскольку это строковый литерал, его невозможно отпустить, и, таким образом, система должна отмечать его как нереализуемую. То, как это делается, заключается в том, чтобы установить значение его сохранения на максимальное целочисленное значение.

NString *str = [[NSString alloc] initWithFormat:@"Hello World. Today is @%", todayDate]; 

Эта строка будет иметь retainCount в 1. Хотя есть символьная константа там, оно добавляется к другой строке. Поскольку вы не можете изменить эту константную строку, создается копия строки «Hello World.», И к ней добавляется содержимое строки TodayDate. Эта память теперь предоставляется владельцу вызывающей стороне, с сохранением. 1.