Как преобразовать (или создать) одноэлементный класс, который компилируется и ведет себя правильно при использовании автоматического подсчета ссылок (ARC) в Xcode 4.2?
172
Как преобразовать (или создать) одноэлементный класс, который компилируется и ведет себя правильно при использовании автоматического подсчета ссылок (ARC) в Xcode 4.2?
Ответы:
Точно так же, как вы (должны) уже делали это:
источник
static
Переменные @David, объявленные в методе / функции, аналогичныstatic
переменной, объявленной вне метода / функции, они действительны только в рамках этого метода / функции. Каждый отдельный прогон+sharedInstance
метода (даже в разных потоках) будет «видеть» одну и ту жеsharedInstance
переменную.если вы хотите создать другой экземпляр по мере необходимости. сделайте следующее:
иначе вы должны сделать это:
источник
dispatch_once()
бит означает, что вы не получите дополнительные экземпляры, даже в первом примере ...?[[MyClass alloc] init]
и обойтиsharedInstance
доступ. DongXu, вы должны посмотреть на статью Питера Хоси Singleton . Если вы собираетесь переопределить,allocWithZone:
чтобы предотвратить создание большего количества экземпляров, вы также должны переопределить,init
чтобы предотвратить повторную инициализацию общего экземпляра.allocWithZone:
версия. Спасибо.Это версия для ARC и не ARC
Как пользоваться:
MySingletonClass.h
MySingletonClass.m
источник
Это мой шаблон под ARC. Удовлетворяет новый шаблон, используя GCD, а также удовлетворяет старый шаблон Apple по предотвращению создания экземпляров.
источник
c1
что он станетAAA
суперклассом России? Вам нужно позвонить+alloc
наself
, а не наsuper
.super
не означает объект суперкласса. Вы не можете получить объект суперкласса. Это просто означает маршрутизацию сообщений в версию метода суперкласса.super
все еще указываетself
класс. Если вы хотите получить объект суперкласса, вам нужно получить функции отражения во время выполнения.-allocWithZone:
метод - это просто простая цепочка для функции выделения времени выполнения, чтобы предложить точку переопределения. В конечном итогеself
указатель == текущий объект класса будет передан распределителю, и, наконец,AAA
экземпляр будет выделен.super
работает в методах класса.Прочитайте этот ответ, а затем иди и прочитайте другой ответ.
Сначала вы должны знать, что означает синглтон и каковы его требования, если вы не понимаете его, тогда вы не поймете решение - вообще!
Чтобы успешно создать синглтон, вы должны выполнить следующие 3:
dispatch_once_t
помогает вам решить условие гонки , позволяя отправлять блок только один раз.Static
помогает вам «запомнить» его значение при любом количестве вызовов. Как это запомнить? Он не позволяет создавать новый экземпляр с таким точным именем вашего sharedInstance, он просто работает с тем, который был создан изначально.Не используя вызовы
alloc
init
(т.alloc
init
Е. У нас все еще есть методы, поскольку мы являемся подклассом NSObject, хотя мы НЕ должны их использовать) в нашем классе sharedInstance, мы достигаем этого с помощью+(instancetype)sharedInstance
ограничения, которое может быть инициировано только один раз , независимо от нескольких попыток из разных потоков. в то же время и помните его значение.Некоторые из наиболее распространенных системных синглетонов, которые поставляются вместе с Какао:
[UIApplication sharedApplication]
[NSUserDefaults standardUserDefaults]
[NSFileManager defaultManager]
[NSBundle mainBundle]
[NSOperations mainQueue]
[NSNotificationCenter defaultCenter]
По сути, все, что должно иметь централизованный эффект, должно следовать какому-то шаблону проектирования Singleton.
источник
В качестве альтернативы Objective-C предоставляет метод инициализации + (void) для NSObject и всех его подклассов. Он всегда вызывается перед любыми методами класса.
Я установил точку останова один раз в iOS 6, и dispatch_once появился в кадрах стека.
источник
Класс Singleton: Никто не может создать более одного объекта класса в любом случае или любым способом.
источник
Есть два вопроса с принятым ответом, которые могут или не могут иметь отношение к вашей цели.
Следующий код решает обе эти проблемы:
источник
Надеюсь, приведенный выше код поможет вам.
источник
если вам нужно создать синглтон в Swift,
или
Вы можете использовать этот способ
источник