Как найти количество сохранений?

#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 включает большое примечание, которое начинается: «ВАЖНО: этот метод обычно не имеет значения при отладке проблем с управлением памятью».