Утечка в инструментах, счетчик ссылок и авто-выпуск - PullRequest
5 голосов
/ 19 ноября 2011

Instruments сообщает мне об утечке переменной NSDate.Но если я сложу резервные копии и выпуски, то я думаю, что они могут быть выпущены по пулу авто-релизов.Возможно, я ошибаюсь, но не хочу быть уверенным.Взгляните на RefCt.Если я [Class alloc] получит счет сохранения 1, то, если я автоматически высвободу этот объект, он сможет освободиться или нет?

enter image description here

1 Ответ

6 голосов
/ 19 ноября 2011

Instruments складывает удержания и релизы для вас. Вот что показывает столбец «RefCt»: промежуточный итог.

Если я [Class alloc] выберет счет сохранения 1, ...

И это действительно так; это первая строка в списке.

… тогда, если я автоматически высвобожу этот объект, он должен быть в состоянии освободиться, или это не так?

Авто-релиз не является немедленным -1; это вызывает выпуск позже, и это -1.

Итак, у вас есть:

  1. Распределение: +1 (= 1)
  2. Авто-релиз: 0 на данный момент; вызывает Release позже (без изменений сейчас, поэтому все еще = 1)
  3. Сохранить: +1 (= 2)
  4. Выпуск: -1 (= 1)
  5. Сохранить: +1 (= 2)
  6. Сохранить: +1 (= 3)
  7. Выпуск: -1 (= 2)
  8. Выпуск: -1 (= 1)

Обратите внимание, что один из трёх выпусков вызван автоматическим выпуском. Только тогда -1 понято.

Для освобождения объекта требуется еще один релиз. Пока этого не произойдет, этого не произойдет.

И да, для объекта, который имеет достаточно выдающихся авто-выпусков, возможно убить его, когда он прибудет из-за того, что он был сохранен до того, как это произойдет, и, таким образом, остаться в живых. Я видел, как это произошло однажды с объектом, который я недооценивал, но это было значением свойства, используемого Binding; Привязка сохранила значение и, таким образом, сохранила его даже после того, как я автоматически выпустила свое последнее владение им.

...