суббота, 31 марта 2012 г.

Еще раз о работе с памятью в Obj-C


Дело обстоит так:

когда создаешь получаешь объект статическим методом вроде stringWithString, то созданный объект попадает в autorelease pool и его счетчик ссылок обнуляется, когда уничтожается этот пул. Однако система может и сама заретайнить некоторые объекты из пула, когда ей не хватает памяти.

Общее правило таково:

Когда ты создаешь получаешь объект методами, в названии которых есть слова alloc, copy, new и retain, то ТЫ СТАНОВИШЬСЯ ВЛАДЕЛЬЦЕМ ОБЪЕКТА И ТЫ ОТВЕЧАЕШЬ ЗА НЕГО И СВОЕВРЕМЕННЫЙ release. Во всех других случаях, ты не являешься владельцем объекта и не вправе контролировать его retainCount - т.е. делать release.

Хочу заметить, что на один alloc, copy, retain должен приходиться один release! То есть не стоит делать несколько раз release, если retain ты сделал всего один раз. ;)

2 комментария:

  1. Осталось не про@бать retain-свойства))

    ОтветитьУдалить
  2. создал retain свойство - обязан сделать synthesize. и так же сразу делай release в dealloc!
    когда синтезируешь свойства, то гетеры и сетеры сами генерируются правильно и ничего не утекает. а вот если ты решил создать собственные механизмы доступа к членам класса, то тут можно проколоться! но это только от неопытности или невнимательности. лучше использовать @property и @synthesize. зачем придумывать велосипед?

    ОтветитьУдалить