Я плохо знаком с целью c и пытаюсь понять, как/когда автовыпуск называют. Я понимаю простой вариант использования:
- (void) foo {
Bar *b = [[[Bar alloc] init] autorelease];
[self doSomething:b];
}
Что относительно этого следующего случая - действительно ли это - ошибка, потому что объект будет сразу выпущен после отъезда объема makeBar?
-(Bar*) makeBar
{
return [[[Bar alloc] init] autorelease];
}
Что, если вызывающая сторона делает сохранение?
Bar *b = [[self makeBar] retain];
Спасибо, - Eric
Во втором примере анонимный объект, который вы возвращаете, будет освобожден не сразу после выхода из области действия makeBar
, а на следующей итерации цикла выполнения. Это даст вам возможность сохранить
его в любом методе, который вызвал makeBar
Так что ваш последний пример подходит, поскольку счетчик retain не упадет ниже 0.
У вас проблемы?
-(Bar*) makeBar
{
return [[[Bar alloc] init] autorelease];
}
Второй случай - это предпочтительный способ возврата объекта Objective-C. За исключением + alloc
, -copy ...
и -create ...
, метод не должен сохранять право собственности на возвращаемый объект, то есть (изменение ) счетчик сохранения должен быть равен 0.
Однако [[Bar alloc] init]
заставляет объект иметь значение keepCount +1, чтобы его нужно было освободить перед возвратом. Но -release
немедленно освободит объект, делая метод бесполезным. Вот почему используется -autorelease
- это отложенный -release
, то есть объект будет выпущен рано или поздно, но не сейчас, поэтому другие части кода все еще могут взаимодействовать с его, но счетчик удержания все еще может быть сбалансирован до 0.
Bar *b = [[self makeBar] retain];
Вам не следует не сохранять его , если вы не хотите быть долгосрочным владельцем объекта b
.