Правило довольно простое: вам нужно освободить объект, только если вы получили его, используя new
, alloc
, retain
или copy
(NARC для краткости). Вот и все. Как только вы закончите с объектом NARC, и он вам больше не нужен, вы должны release
. Если вы получили объект любым другим способом, вы не должны release
его.
Если вы получили объект с помощью NARC где-то в инициализации класса, и вам нужно сохранить этот объект в течение времени жизни экземпляра класса, тогда release
это в методе dealloc
. Это гарантирует, что объект живет столько, сколько вам нужно, и умирает после смерти экземпляра класса.
В Objective-C каждый экземпляр содержит свойство подсчета ссылок. Когда вы создаете объект с NARC, этот счетчик ссылок равен 1. Каждый последующий retain
будет увеличивать счетчик ссылок на 1. Каждый последующий release
будет уменьшать счетчик ссылок на 1. Когда счетчик ссылок достигает 0, объект перераспределена.
Итак, если вы не освободите объекты NARC, у вас будет утечка памяти (поскольку счетчик ссылок останется выше 0 и объект никогда не будет освобожден, даже если вы покончили с этим). Это означает, что у вашего приложения будет место в памяти, которое оно никогда не будет использовать. Если они сложатся, то вы будете тратить много ценных системных ресурсов. На iOS это, скорее всего, убьет ваше приложение.
Если вам нужно вернуть объект, созданный с помощью NARC, вам следует autorelease
его. По сути, это означает, что «объект будет вызываться release
чуть позже». Так что если метод, вызывающий ваш метод, должен содержать возвращаемый объект, он может retain
его, и теперь объект имеет счетчик ссылок, установленный на 2. release
будет вызван немного позже, как запланировано, но объект был retain
ed, его счетчик ссылок будет равен 1, и он не умрет. Теперь вызывающий абонент должен позвонить по номеру release
, когда это будет сделано.