Pergunta

Trabalho em C # e Java, eu vi basicamente uma forma Inicializa todo mundo singletons:

static obj _inst = null;

obj getInstance() {
  if (_inst == null) {
    _inst = new obj();
  }
  return _inst;
}

Agora, quando eu passar para Objective-C para o iPhone, sempre que vejo exemplos de código, vejo basicamente a mesma coisa:

static obj _inst = nil;

+ (obj *) sharedObj {
  if (!_inst) {
    _inst = [[obj alloc] init];
  }
  return _inst;
}

Há um método de classe +initialize que é chamado em cada classe no tempo de execução Objective-C antes de ser usado. Existe alguma razão que eu não poderia usar isso para criar meus singletons?

static obj _inst = nil;

+ (void) initialize {
  if (self == [obj class]) {
    _inst = [[obj alloc] init];
  }
}

+ (obj *) sharedObj {
  return _inst;
}

Ele funciona muito bem quando eu experimentá-lo no meu código, e ele se livrar de verificação para ver se ele existe cada vez antes de ser acessado. Existe alguma razão que eu não deveria criar singletons desta maneira?

Foi útil?

Solução

Tanto quanto eu estou preocupado +initialize é a maneira de fazê-lo. Peter Hosey sugere um par de outras capturas (dentro -init e -allocWithZone:) para se certificar de que você não pode instanciar mais do que uma instância da classe, nunca. Tornando-se assim uma classe singleton verdadeira e não apenas uma classe com um ponteiro para uma instância específica de si dentro dela.

Outras dicas

A inicialização do singleton em + initialize irá sempre alocar a instância. Se a instância exige recursos significativos (incluindo o tempo initializarion que irá estender o tempo antes de sua aplicação torna-se sensível à statup) e pode não ser utilizado, initializarion preguiçoso, como em seus exemplos faz sentido.

Inicialização lenta todo o caminho!

Eu prefiro este padrão (semelhante ao que você tem):

+ (id) sharedInstance {
     static MyObject *sMyObject = nil;
     if (!sMyObject) {
         sMyObject = [[MyObject alloc] init];
     }
     return sMyObject;
}

- (oneway void) release { 
     // no-op
}

Não há necessidade de colocar isso em + (void) initialize para uma Singleton, uma vez que só será chamado quando você tentar usar a classe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top