Использование свойств компилятора


Использование свойств компилятора

При использовании свойств компилятор берет на себя управление памятью. Все свойства, объявлявшиеся нами до настоящего момента, имели атрибут retain. Генерируя метод записи для этого свойства, компилятор включает в него необходимые операции управления памятью.

Так release просто освобождает память, занимаемую свойствами, верно?

Да, но что еще важнее — он сокращает количество владельцев объекта.

Если вы хотите, чтобы объект оставался в памяти, увеличьте количество его владельцев, отправив ему сообщение retain (не забывайте, что владельцев может быть несколько). Отправляя объекту сообщение release, вы исключаете себя из списка владельцев. Если у объекта не осталось других владельцев, он будет уничтожен. По этой причине очень важно не отправлять сообщения release объектам, владельцем которых вы не являетесь (то есть объектам, которым ранее не отправлялось сообщение retain).

Иногда вы просто отказываетесь от владения объектом, но в других случаях объект необходимо задержать в памяти для продолжения работы с ним. Для подобных ситуаций в Objective-C существует концепция пула автоосвобождения. Это массив объектов, которые будут освобождены исполнительной средой после завершения обработки текущего события. Чтобы поместить объект в пул автоосвобождения, отправьте ему сообщение autorelease (вместо простого сообщения release):

[aString autorelease];

Счетчик ссылок объекта не изменится, но после завершения текущего цикла обработки событий объекту будет автоматически отправлено сообщение release. Злоупотреблять этой возможностью не стоит, потому что она недостаточно эффективна. Нельзя сказать, что она вредна, и все же лучше вызывать retain и release в нужные моменты.

Чтобы управление памятью работало нормально, необходимо запомнить две вещи.

Управление памятью в крупных приложениях основательно усложняется, поэтому фирма Apple установила пару правил для определения того, кто и когда отвечает за освобождение и сохранение объектов.

Вы являетесь владельцем объектов, создаваемых посредством alloc, new, copy или mutableCopy.

Счетчик сохранения такого объекта равен 1, а вы отвечаете за отправку сообщения release после завершения работы с объектом. Объект также можно поместить в пул автоосвобож- дения, если вы хотите, чтобы система послала сообщение release позднее.

Считайте, что все остальные объекты будут уничтожены в конце цикла событий, если только вы не станете их владельцем.

Если объект был создан другим способом (форматирование строк, инициализация массивов и т. д.), считайте, что счетчик ссылок равен 1, а объект будет автоматически освобожден. Если вы хотите работать с объектом за пределами метода, в котором он был создан, отправьте ему сообщение retain (и сообщение release, когда закончите работать с ним).
  • Дата: 3-12-2014, 22:45

Предыдущие статьи сайта:

Понравилась статья? Ставь лайки, рассказывай друзьям!



Отзывы о статье: Использование свойств компилятора

Технологии, секреты и фишки Apple: Iphone, iPad, iPod