Como converter (ou criar) uma classe singleton que compila e se comporta corretamente ao usar a contagem automática de referência (ARC) no Xcode 4.2?
objective-c
ios
singleton
automatic-ref-counting
cescofry
fonte
fonte
Respostas:
Exatamente da mesma maneira que você (deveria) já estava fazendo isso:
fonte
static
variáveis @David declaradas em um método / função são as mesmas que umastatic
variável declarada fora de um método / função, elas são válidas apenas no escopo desse método / função. Cada execução separada do+sharedInstance
método (mesmo em threads diferentes) 'verá' a mesmasharedInstance
variável.se você deseja criar outra instância, conforme necessário. faça isso:
caso contrário, você deve fazer o seguinte:
fonte
dispatch_once()
bit significa que você não obterá instâncias adicionais, mesmo no primeiro exemplo ...?[[MyClass alloc] init]
e ignorar osharedInstance
acesso. DongXu, você deve ler o artigo de Peter Hosey em Singleton . Se você deseja substituirallocWithZone:
para impedir que mais instâncias sejam criadas, também deve substituirinit
para impedir que a instância compartilhada seja reinicializada.allocWithZone:
versão. THX.Esta é uma versão para ARC e não-ARC
Como usar:
MySingletonClass.h
MySingletonClass.m
fonte
Este é o meu padrão no ARC. Satisfaz novo padrão usando o GCD e também satisfaz o antigo padrão de prevenção de instanciação da Apple.
fonte
c1
uma instância daAAA
superclasse de? Você precisa chamar+alloc
emself
, e não sobresuper
.super
não significa o objeto de superclasse. Você não pode obter um objeto de superclasse Apenas significa rotear mensagens para a versão de superclasse do método.super
ainda apontaself
classe. Se você deseja obter um objeto de superclasse, precisa obter funções de reflexão em tempo de execução.-allocWithZone:
método é apenas uma cadeia simples para a função de alocação do tempo de execução para oferecer um ponto de substituição. Então, finalmente, oself
ponteiro == objeto de classe atual será passado para o alocador e, finalmente, aAAA
instância será alocada.super
funciona nos métodos de classe.Leia esta resposta e depois leia a outra resposta.
Você deve primeiro saber o que significa um Singleton e quais são seus requisitos, se você não o entender, do que você não entenderá a solução - de maneira alguma!
Para criar um Singleton com sucesso, você deve poder fazer o seguinte 3:
dispatch_once_t
ajuda a resolver uma condição de corrida, permitindo apenas que seu bloco seja despachado uma vez.Static
ajuda a "lembrar" seu valor em qualquer número de invocações. Como isso se lembra? Ele não permite que nenhuma nova instância com esse nome exato da sua sharedInstance seja criada novamente, apenas funciona com a que foi criada originalmente.Não usando chamada
alloc
init
(ou seja, ainda temosalloc
init
métodos, pois somos uma subclasse NSObject, embora NÃO devamos usá-los) em nossa classe sharedInstance, conseguimos isso usando+(instancetype)sharedInstance
, que é limitado a ser iniciado apenas uma vez , independentemente de várias tentativas de threads diferentes ao mesmo tempo e lembre-se de seu valor.Alguns dos Singletons do sistema mais comuns que acompanham o próprio cacau são:
[UIApplication sharedApplication]
[NSUserDefaults standardUserDefaults]
[NSFileManager defaultManager]
[NSBundle mainBundle]
[NSOperations mainQueue]
[NSNotificationCenter defaultCenter]
Basicamente, qualquer coisa que precisaria ter efeito centralizado precisaria seguir algum tipo de padrão de design Singleton.
fonte
Como alternativa, o Objective-C fornece o método de inicialização + (void) para o NSObject e todas as suas subclasses. É sempre chamado antes de qualquer método da classe.
Eu configurei um ponto de interrupção em uma vez no iOS 6 e o dispatch_once apareceu nos quadros da pilha.
fonte
Classe Singleton: Ninguém pode criar mais de um objeto de classe em qualquer caso ou de qualquer maneira.
fonte
Existem dois problemas com a resposta aceita, que podem ou não ser relevantes para o seu propósito.
O código a seguir cuida desses dois problemas:
fonte
Espero que o código acima o ajude.
fonte
se você precisar criar singleton rapidamente,
ou
você pode usar dessa maneira
fonte