2013-09-23 8 views
9

PARSING через этот document on class clusters, NSNumber реализует initWithChar: в примерно следующим образом:Инициализаторы кластера с ARC

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

Кроме того, вы можете использовать этот шаблон для инициализации видом из СИБ:

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

I Интересно, разве ARC управляет выпуском невозвращенного self в этих случаях? Документировано ли это где угодно?

+0

Это «кластеры классов», а не «кластерные классы». – jlehr

ответ

6

Найдено in the clang documentation.

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

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

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

+0

Спасибо, Брайан. Не могли бы вы показать, как будет выглядеть код? – Slabko

+1

@Slabko Нет ничего, кроме возвращения нового экземпляра подкласса в 'initWith ...'. Я собрал здесь несколько примеров кластеров классов: https://github.com/bnickel/Cluster-Initializer-Examples –

3

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

Смежные вопросы