Кластерные инициализаторы с ARC

Разбор этого документа по кластерам классов, NSNumber инвентарь initWithChar: примерно следующим образом:

- (id)initWithChar:(char)c
{
    [self release];
    return [[__NSCharNumber alloc] initWithChar:c];
}

Точно так же вы можете использовать этот шаблон для инициализации представлений из Nib:

- (id)initWithFrame:(CGRect)frame
{
    id realSelf = [[self class] nib] instantiateWithOwner:nil options:nil][0];
    realSelf.frame = frame;
    [self release];
    return realSelf;
}

Мне интересно, управляет ли ARC выпуском невозвращенных self в этих случаях? Это где-нибудь задокументировано?

2 ответа

Решение

Нашел подробности в документации кланга.

init неявно использует __attribute__((ns_consumes_self)) атрибут, означающий, что в то время как self определяется как __strong id selfпервоначальное назначение не выполняет сохранение. Это значит, как только self переназначается или функция завершается, self будет выпущен с использованием стандартных строгих правил.

Чтобы получить +1, есть неявный __attribute((ns_returns_retained)) который препятствует тому, чтобы возвращенный объект был выпущен в конце.

На высоком уровне ARC планирует выпустить начальное значение self один дополнительный раз к концу функции, сохраняя при этом возвращаемое значение, сохраняя его +1 выход.

Это подпадает под стандартные правила владения объектами ARC, согласно которым "невозвращенный self"закончится без каких-либо сильных ссылок и поэтому будет автоматически выпущен для вас, когда он выходит за рамки.

Другие вопросы по тегам