Понятно, что input
- указатель. Вы объявили его тип в списке аргументов как NSNumber*
.
input
- указатель на объект типа NSNumber
. Внутренне объект имеет целочисленную переменную, которая содержит количество внешних ссылок на него. Отправка сообщения retain
объекту увеличивает его счетчик ссылок. Отправка сообщения release
уменьшит счет. Отправка сообщения autorelease
добавит объект в локальный пул автоматического выпуска, который будет отслеживать автоматически выпущенные объекты, и отправит им сообщение release
в следующий раз, когда он опустошится. Объект со счетчиком ссылок 1, который получает сообщение release
, будет освобожден, а его метод dealloc
будет вызван. Вы должны освободить все имеющиеся у вас ресурсы, когда вас освободят.
Когда вы устанавливаете свойство, вы хотите освободить старое значение и убедиться, что новое значение сохраняется, пока сам объект жив. Чтобы убедиться, что новое значение сохраняется, вы увеличиваете его счетчик ссылок на 1, отправляя ему сообщение retain
. Чтобы освободить старый объект, вы отправите ему сообщение об освобождении. Здесь есть одна тонкая проблема. Если старое значение совпадает с новым значением, если вы сначала высвободите старое значение, а его счетчик сохранения был равен 1, он будет уничтожен, прежде чем вы сможете увеличить его. Вот почему вы должны сохранить новое значение перед выпуском старого.