Uso adequado do iPhone do Delegado do Aplicativo

Eu estou olhando para poder referenciar certos estados / objects através de qualquer lugar na minha aplicação. Por exemplo, um usuário efetua login no aplicativo, eu preciso chamar um serviço da web e recuperar as informações dos usuários. Então eu quero ser capaz de acessar essas informações de qualquer lugar no aplicativo com algo como o seguinte:

myAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; user = delegate.u; 

Está definindo uma variável de instância como um object Usuário no delegado do aplicativo e fazendo referência a ela a partir de lá quando é necessária uma maneira ruim de fazer isso? Eu normalmente configuro isso lá no login do usuário.

Queria ouvir como os profissionais lidam com isso.

Normalmente, você só deve conectar coisas ao delegado do aplicativo se elas:

  • Foram criados a partir do mesmo arquivo NIB que o delegado do aplicativo (ou seja, elementos estáticos da interface do usuário em interfaces de janela única)
  • Estão associados à manipulação de events no nível do aplicativo que passa pelo delegado do aplicativo (como o item de menu da janela Preferências)

Para todo o resto, você deve criar um singleton que gere o access a eles.

Jason Coco sugeriu o roteamento através do Application Controller. Em meus programas, normalmente evito isso, pois acho que isso coloca muita responsabilidade no nível mais alto – acho que as coisas devem se autogerenciar onde possível e que o gerenciamento de nível superior deve ser usado apenas quando há uma necessidade de coordenação entre pares. módulos de nível.

Eu não estou indo link meu próprio blog, mas se você google mim e singletons você provavelmente encontrará um post que escrevi entrar em mais detalhes.

Matt é um pouco modesto demais. Sua postagem sobre o assunto é uma das melhores que eu li, e merece um link. http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

Eu não vejo nenhum problema com sua abordagem. Eu costumo usar um singleton para lidar com essa situação:

 // MyCommon.h: @interface MyCommon class MyCommon : NSObject { int user; }; @property(assign) int user; + (MyCommon *)singleton; @end // MyCommon.m: @implementation MyCommon static MyCommon * MyCommon_Singleton = nil; + (MyCommon *)singleton { if (nil == MyCommon_Singleton) { MyCommon_Singleton = [[MyCommon_Singleton alloc] init]; } return MyCommon_Singleton; } @end 

O singleton MyCommon é então usado em qualquer lugar em meu aplicativo da seguinte maneira:

 int user = [MyCommon singleton].user; 

Normalmente, você perguntaria ao controlador do seu aplicativo por essa informação e seria responsável por saber como armazená-lo / procurá-lo em qualquer modelo de dados existente. O controlador do seu aplicativo pode ou não ser o mesmo que o delegado de aplicativos (na maioria dos aplicativos simples, é o mesmo).