2012-02-15 26 views
6

Estoy trabajando en una clase para mi aplicación de iPhone, y me gustaría que se registre y tenga en cuenta los cambios de estado de la aplicación (UIApplicationDidEnterBackgroundNotification, etc.). ¿Hay alguna forma de registrar una clase para notificaciones sin tener que mantener un objeto instanciado en la memoria? Solo quiero que las notificaciones apropiadas llamen a la clase para iniciar, hacer algunas cosas y luego dejar la memoria nuevamente.¿Puedo registrar una clase para NSNotifications? ¿Puedo usar métodos de clase con NSNotifications?

En este momento me he lo siguiente en el método init:

[[NSNotificationCenter defaultCenter] addObserver: self 
             selector: @selector(handleEnteredBackground) 
              name: UIApplicationDidEnterBackgroundNotification 
              object: nil]; 

y este método en otras partes del archivo .m de la clase:

- (void) handleEnteredBackground { 
    NSLog(@"Entered Background"); } 

que una instancia de la clase una vez bajo applicationDidLoad, pero dado que no hago nada con eso, supongo que ARC elimina el objeto de la memoria y la aplicación se bloquea (sin ningún código de error útil, fíjate) cuando voy a cerrarlo. Si cambio handleEnteredBackground a un método de clase con un signo "+", recibo errores de selector no válidos cuando cierro la aplicación.

El objetivo final es crear una instancia de una clase una vez en el ciclo de vida de una aplicación y poder responder a los cambios de estado de la aplicación sin ningún código adicional fuera de la clase. Asumir iOS 5 + Xcode 4.2+

Respuesta

3

Debería mirar en singletons.

Puede crear fácilmente un objeto que dure todo el ciclo de vida de la aplicación.

+ (id)sharedObserver 
{ 
    static dispatch_once_t once; 
    static YourObserverClass *sharedObserver = nil; 

    dispatch_once(&once, ^{ 
     sharedObserver = [[self alloc] init]; 
    }); 

    return sharedObserver; 
} 
- (void)startObserving 
{ 
    // Add as observer here 
} 

Ahora se puede llamar [[YourObserverClass sharedObserver] startObserving] y usted no tiene que preocuparse por retenerlo etc.

+0

Esto suena como una gran solución ... Voy a darle un tiro y aceptar la respuesta una vez que he tenido la oportunidad de probarlo ¡fuera! – Amos

+0

No hay problema. Simplemente escriba aquí si tiene más preguntas. – hwaxxer

17

El siguiente debe funcionar:

[[NSNotificationCenter defaultCenter] addObserver: [self class] 
             selector: @selector(handleEnteredBackground:) 
              name: UIApplicationDidEnterBackgroundNotification 
              object: nil]; 

El selector sí:

+ (void) handleEnteredBackground: (NSNotification *) notification 
{ 
} 

No tiene que anular el registro del observador, porque el objeto de la clase no puede tratarse localizado o destruido de otra manera. Si necesita anular el registro del observador por otras razones, se puede:

[[NSNotificationCenter defaultCenter] removeObserver: [self class]]; 
+0

Costique: Xcode no me deja usar [self class] para registrarme como un observador dentro de la clase - me dice "Received type '' por ejemplo el mensaje no declara un método con el selector '' – Amos

+1

@Amos Yes , si te registras con 'NSNotificationCenter' en un método de clase, usa' self' en lugar de '[self class]'. La razón es que 'self' se refiere a una instancia de una clase dentro de los métodos de instancia, y al objeto de clase dentro de los métodos de clase. – Costique

+0

@Amos: ¿de qué convocatoria obtienes esta advertencia? – user102008

Cuestiones relacionadas