Вы, вероятно, уже читали этот раздел документации Apple по управлению памятью, но я укажу на раздел о Политике владения объектами на всякий случай. Вы несете ответственность только за управление памятью объектов, которыми вы «владеете». Цитировать документы:
- Вам принадлежит любой созданный вами объект.
- Вы «создаете» объект, используя метод, имя которого начинается с «alloc» или «new» или содержит «copy» (например, alloc, newObject или mutableCopy).
- Если вы владеете объектом, вы несете ответственность за отказ от владения, когда закончите с ним. [то есть: выпуск]
- Если вы не являетесь владельцем объекта, вы не должны освобождать его.
Раздел «Простые примеры» в этих документах дает хорошую проработку, но для того, чтобы изложить вышеприведенные вопросы в контексте ваших конкретных вопросов:
Как мне в памяти управлять этими "промежуточными" объектами?
Хорошая новость: вы этого не делаете. Игнорируйте аспект управления памятью «промежуточных» объектов в вашем примере.
- Они были только что созданы или они всегда существовали?
Возможно, они существовали всегда или могли быть созданы. Прелесть объективной цели в том, что вам, как потребителю этих предметов, не нужно заботиться.
- Могу ли я сохранить их, и если я выпущу объект, который их создал, они тоже будут освобождены?
Вам не нужно сохранять их, если вы просто передаете их какой-либо другой функции или сами используете их в качестве промежуточных значений в своих собственных вычислениях внутри функции. Скажем, например, что вы возвращаете stringValue
из вашего примера функции кому-то еще. Нет смысла его удерживать, только чтобы вернуть.
Если вы действительно сохраните его, тогда да, вы несете ответственность за выдачу соответствующего сообщения о выпуске в качестве некоторого пункта. Например, вы можете сохранить stringValue
из вашего примера, если хотите сохранить это значение как свойство в своем собственном экземпляре. Objective-C использует подсчет ссылок. Если вам нужно, чтобы этот объект оставался в течение долгого времени, вы должны сохранить его, чтобы чужое сообщение об освобождении не приводило к его исчезновению, если счет сохранения упал до 0.
Они автоматически выпущены?
Зависит. Допустим, вы просите строку из instanceOfNSWhatever
. Если instanceOfNSWhatever
должен создать эту строку просто специально для вас (для обслуживания вашего запроса), но не заботится об этой строке, то да ... instanceOfNSWhatever
, вероятно, поместит эту строку в пул автоматического выпуска. Если строка уже была свойством instanceOfNSWhatever
и просто отправляла ее вам в ответ на ваш запрос, то нет, вероятно, она не была автоматически выпущена.
Опять же, красота в том, что вы не знаете и не должны заботиться. Поскольку instanceOfNSWhatever
создал строку, он отвечает за ее управление. Вы можете игнорировать управление памятью, если не добавите в строку, отправив ей сообщение сохранения.
Что делать, если я запускаю [instanceOfNSWh what stringValue] миллион раз в цикле? Могу ли я утилизировать все эти строки NSS при необходимости?
Нет необходимости. Опять же ... stringValue
не ваше управление, потому что вы его не создали. В качестве технического примечания: если instanceOfNSWhatever
действительно нужно было создать 1 миллион копий stringValue
для обслуживания ваших 1 миллиона вызовов, то, вероятно, они поместили бы их все в пул авто-релиза, который будет удален в конце текущего события какао. петля. К счастью, если вы не отправите каждому из этих stringValue
объектов сообщение о сохранении, вы можете тут же проигнорировать вопрос об управлении памятью.