автоосвобождение предыдущего объекта по назначению

Если у меня есть такая функция

void setSomeObject( SomeObjectClass obj /*, and some other params*/ )
{
  [_previous autorelease];
  _previous = obj;
}

Насколько я понял, сообщение autorelease отправляется самому объекту (не _previous), поэтому в какой-то момент, когда setSomeObject выходит из области видимости, исходный объект автоматически освобождается (если есть). Это правильно? Я не использую свойства, но полагаю, что при их использовании освобождение предыдущего объекта будет автоматическим, когда я выполню self.previous = obj; ?


person BuggerMe    schedule 29.06.2010    source источник


Ответы (2)


Когда вы отправляете сообщение -autorelease объекту, оно добавляется к активному NSAutoreleasePool, который очищается при выполнении цикла выполнения. Если вы скажете [_previous autorelease], будет автоматически выпущен только этот объект, а если вы затем скажете _previous = obj, это только изменит ссылку на переменную. Старый объект по-прежнему автоматически освобождается.

Если вы делаете это в методе установщика, обычно это шаблон:

- (void)setSomeObject:(MyObjClass *obj) {
    if (obj != someObject) {
        [someObject release];
        someObject = [obj retain]; // or copy, depending on what you want
    }
}
person jtbandes    schedule 29.06.2010
comment
так что в некотором смысле можно было бы написать и [_previous autorelease], но это не стандартно? (хотя нужно убедиться, что он еще не указывает на тот же объект) - person BuggerMe; 29.06.2010
comment
да. Если вы помните фундаментальные правила управления памятью, любой объект, владельцем которого вы являетесь (полученный с помощью alloc/new/copy/retain), должен быть позже освобожден (освобождение или автоматическое освобождение), так что любой из них будет работать. Но в этом случае нет необходимости в автозапуске, так как вам не нужно ссылаться на объект в остальной части функции. Другой способ избежать всего этого — использовать обычные @property (копировать) или (сохранять) с @synthesize, которые создают для вас методы доступа, и вместо того, чтобы делать все, что я написал в своем ответе, вы можете просто сделать self.someObject = obj. - person jtbandes; 29.06.2010

Нет, это неправильно.

[_previous autorelease] отправляет сообщение об автоматическом выпуске в _previous. В этом смысл этого синтаксиса.

person Gary    schedule 29.06.2010