Действительно ли возвратитесь автовыпуск является ошибкой в цели c?

Я плохо знаком с целью 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

7
задан Tom Duckering 17 February 2010 в 16:15
поделиться

2 ответа

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

Так что ваш последний пример подходит, поскольку счетчик retain не упадет ниже 0.

У вас проблемы?

7
ответ дан 6 December 2019 в 21:13
поделиться
-(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 .

5
ответ дан 6 December 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: