Кластерные инициализаторы с 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
"закончится без каких-либо сильных ссылок и поэтому будет автоматически выпущен для вас, когда он выходит за рамки.