Когда и почему я должен использовать релиз? - PullRequest
1 голос
/ 04 августа 2011

Я изучаю Objective-C и XCode, наблюдая учебные пособия и пробуя, так что я сам.У меня никогда не было настоящего урока с учителями или чем-то подобным.И я никогда не узнаю, для чего используется release.Я часто видел это, конечно, но я хочу знать кое-что об этом.Должен ли я использовать release для каждого объекта, который я объявил в заголовочном файле в - (void)dealloc?Если я создаю временную строку NSString в IBAction, должен ли я выпустить ее в конце действия?Что произойдет, если я не использую релиз?Что на самом деле означает релиз на языке программирования?

Ответы [ 2 ]

5 голосов
/ 04 августа 2011

Правило довольно простое: вам нужно освободить объект, только если вы получили его, используя 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, когда это будет сделано.

1 голос
/ 04 августа 2011

Вам, вероятно, будет полезно ознакомиться с основными понятиями управления памятью в Objective-C (выделение, подсчет ссылок, сохранение / освобождение / автоматическое освобождение ...).

Apple дает хорошее представление здесь.

Это тема, которая может легко запутать как начинающих, так и опытных программистов, и вы окажете себе большую услугу, если будете хорошо понимать ее.

Это действительно не то, что можно объяснить в 10 строках. Но начните читать вышеупомянутый документ, и вы будете на пути к лучшему пониманию управления памятью в Какао.

...