Вот в чем дело: retainCount
- это деталь реализации. Вы никогда не можете полагаться на то, что это какая-то конкретная ценность. Все, что вам действительно нужно подумать, это то, являетесь ли вы владельцем объекта или нет.
После того, как вы распределили строку, она становится вашей. Когда вы автоматически освобождаете строку, она больше не принадлежит вам, и она может исчезнуть при сливе / освобождении пула автоматического выпуска. Если никто не владеет им, он исчезнет , когда вы освободите пул автоматического выпуска. В любом случае, вы не можете законно отправлять строковые сообщения после освобождения пула автоматического выпуска.
В текущей реализации строка создается с счетом сохранения 1. Авто-релиз не изменяет счет хранения. Когда пул освобождается, release
отправляется всем объектам в нем, включая вашу строку. Код в релизе выглядит примерно так:
if (retainCount == 1)
{
[self dealloc];
}
else
{
retainCount--;
}
Таким образом, вы можете видеть, что счетчик никогда не упадет до нуля. Ваш окончательный NSLog работает, потому что память, используемая строкой, еще не была переработана.