Instruments складывает удержания и релизы для вас. Вот что показывает столбец «RefCt»: промежуточный итог.
Если я [Class alloc] выберет счет сохранения 1, ...
И это действительно так; это первая строка в списке.
… тогда, если я автоматически высвобожу этот объект, он должен быть в состоянии освободиться, или это не так?
Авто-релиз не является немедленным -1; это вызывает выпуск позже, и это -1.
Итак, у вас есть:
- Распределение: +1 (= 1)
- Авто-релиз: 0 на данный момент; вызывает Release позже (без изменений сейчас, поэтому все еще = 1)
- Сохранить: +1 (= 2)
- Выпуск: -1 (= 1)
- Сохранить: +1 (= 2)
- Сохранить: +1 (= 3)
- Выпуск: -1 (= 2)
- Выпуск: -1 (= 1)
Обратите внимание, что один из трёх выпусков вызван автоматическим выпуском. Только тогда -1 понято.
Для освобождения объекта требуется еще один релиз. Пока этого не произойдет, этого не произойдет.
И да, для объекта, который имеет достаточно выдающихся авто-выпусков, возможно убить его, когда он прибудет из-за того, что он был сохранен до того, как это произойдет, и, таким образом, остаться в живых. Я видел, как это произошло однажды с объектом, который я недооценивал, но это было значением свойства, используемого Binding; Привязка сохранила значение и, таким образом, сохранила его даже после того, как я автоматически выпустила свое последнее владение им.