#objective-c #retaincount
#objective-c #retaincount
Вопрос:
Пожалуйста, объясните мне приведенный ниже код строк, я просто в замешательстве..,
Nsstring *a;
Nsstring *b;
a = [b retain];
каково количество сохранений для a amp; b.
a = [b copy];
каково количество сохранений для a amp; b.
Заранее спасибо.
Ответ №1:
Технически количество сохранений в опубликованной вами ситуации не определено, поскольку вы никогда не инициализируете свои переменные. Вызов retain
неинициализированного указателя, вероятно, приведет к сбою.
Во-вторых, количество сохранений в вашей ситуации зависит от того, как вы инициализируете свои переменные.
NSString *a;
NSString *b = @"test";
a = [b retain];
/* Both variables reference the same object which has been retained.
Retain count 1
*/
NSString *a;
NSString *b = @"test 2";
a = [b copy];
/* `a` has a retain count 1 (a variable returned from a `copy`
method has a retain count 1). `b` retain count does not change
(you haven't called `retain` on `b`, so it's count remains the
same.
*/
Если вы еще этого не сделали, вам следует ознакомиться с рекомендациями Apple по управлению памятью. Кроме того, если у вас нет очень веской причины не делать этого, вы должны использовать ARC, который освобождает вас от большинства головных болей от ручного управления памятью.
В комментариях к другому ответу вы спрашиваете, как определить количество сохранений для объекта. Вы всегда отслеживаете это самостоятельно. Другие объекты могут сохранять и освобождать вашу строку, но вам все равно. Если вы создаете и возражаете, используя alloc
, вызываете retain
объект или copy
объект, вы несете ответственность за освобождение или автоматическое освобождение этого объекта, когда вы закончите с ним. В противном случае это не ваша ответственность. Абсолютное количество сохранений объекта никогда не имеет значения.
Комментарии:
1. Спасибо за пример и очень хорошее объяснение, теперь я знаю, о чем я спрашивал.
2. Важно ли освобождать объект, если мы не освободим, какова будет ситуация?
3. @kubi Ты действительно запустил свою программу?
NSString
выполняет множество сумасшедших оптимизаций.retainCount
В вашем примере all возвращает максимально допустимое целое числоNSUInteger
. Это еще одна причина, по которой вы не должны использоватьretainCount
какой-либо объект.4. @Yuji. Да, вы правы. Я использовал «количество сохранений» более абстрактным способом.
5. Если бы вы переключились на разговор исключительно о дельте к количеству сохранений, тогда не имеет значения, какие дурацкие детали реализации находятся в игре… вы беспокоитесь о балансировке ваших сохранений с выпусками, и, кроме того, количество сохранений не имеет значения.
Ответ №2:
NSString
не имеет количества сохранений, которое имело бы смысл. Но если вы используете в качестве общего примера, способ найти количество сохранений для объектов с нормальным количеством сохранений::
[a retainCount]
Комментарии:
1. Вы никогда не должны использовать
retainCount
. Это деталь реализации, которая почти никогда не бывает полезной для чего-либо практического.2. И вы никогда не должны вызывать retainCount в реальной программе (это довольно верный признак того, что вы делаете что-то не так.)
3. Я обновил свой ответ, но вкратце: вам все равно, что такое количество сохранений.
4. @Dani Это очень плохо для отладки проблем с памятью… Используйте zombies для их отладки, а не для сохранения!
5. @Dani: Просмотр количества сохранений не очень хорош для отладки, потому что они дают вам ужасно неполную и, вполне возможно, вводящую в заблуждение картину управления памятью объекта. Если вам нужно посмотреть количество сохранений, это обычно потому, что вы делаете что-то еще неправильно. Документация по
retainCount
even включает большое примечание, которое начинается: «ВАЖНО: этот метод обычно не имеет значения при отладке проблем с управлением памятью».