0

Я создаю одиночку, как показано ниже:Создает ли [self new] в блоке сильный ссылочный цикл?

static MyType* shared = nil; 
static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    shared = [self new]; 
}); 
return shared; 

Я знаю, что код в блоке будет выполняться один раз и self будет nil в этой точке, так [self new] будет равен [MyType new]. Но потом я думал о ситуации, когда я вызываю [self new] в блок, который не предназначен для однотонных целей и может быть вызван более одного раза.

Будет [self new] действовать как [MyType new] или блок будет захватывать self? Правильно ли создать новый экземпляр MyType с использованием [self new]? Каковы преимущества использования [self new] вместо [MyType new]?

+0

при вызове самостоятельного новый] вне вашего одноточечного метода инициализации, вы создаете новый экземпляр. Нет смысла создавать singleton, если вы хотите называть [self new] вне его. –

+0

@TejaNandamuri вопрос: «Делает ли блок, который использует [self new] в нем, будет захватывать себя?», Извините, если это не выяснено. – WantToKnow

+0

Нет, сильная ссылка не будет создана, если вы не назовете этот блок, используя self. И вы должны использовать слабый, если хотите называть себя в блоке. Лучше всего это можно найти здесь http://stackoverflow.com/questions/20030873/always-pass-weak-reference-of-self-into-block-in-arc –

ответ

0

Будет ли [сам новый] действовать как [MyType new] или блок захватит себя?

Как уже упоминалось в других ответах, это не цикл сохранения. Однако имейте в виду, что self указывает на объект класса, а объекты класса не являются объектом ARC: у них есть вечный срок службы.

Правильный способ создания нового экземпляра MyType с помощью [self new]?

Это лучший способ. Смотри ниже.

Каковы преимущества использования [self new] вместо [MyType new]?

Внутри реализации класса вы должны почти всегда использования self вместо MyType. (Но ваш код является одним из редких примеров того, что у него нет преимуществ из-за статической переменной.)

Причина этого заключается в том, что этот код может использоваться подклассами. Если вы введете конкретный тип в свой код, каждый метод создания должен быть перезаписан, что может привести к большому количеству кода и вызвать проблему с разбитым базовым классом.

Пример:

@implementation BaseClass 
+ (instancetype)new… 
{ 
    BaseClass *instance = [BaseClass new]; 
    … 
} 
@end 

@interfac Subclass : BaseClass 
… 
@end 

Это сломано, потому что ...

id instance = [Subclass new…]; 

... бы создать экземпляр подкласса.

Вы должны переписать new…, какие есть дополнительные проблемы:

@implementation Subclass 
+(instancetype)new… 
{ 
    /* Subclass *instance = [super new]; Does NOT work*/ 
    … Complete re-implementation of +new… (BaseClass) 
} 
1

№ Нет. «Цикл» отсутствует. Блок фиксирует сильную ссылку на объект класса (это то, что указывает self, поскольку это метод класса). Объект класса не содержит ссылки на блок.

0

Да, self улавливается блоком, однако блок не фиксируется self, поэтому никакого цикла выпуска нет. Так или иначе, поскольку self указывает на объект класса для MyType, и поскольку объекты класса никогда не освобождаются, вам не стоит беспокоиться о сохранении циклов в этом конкретном сценарии.

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