2009-04-11 19 views
5

Ad esempio, quando la memoria si sta esaurendo, il sistema invia una notifica UIApplicationDidReceiveMemoryWarningNotification. Questo è tutto ciò che Apple dice nei suoi documenti a quel punto. Ma da dove viene questa notifica e a quale metodo viene inviata? O dove e come registro ciò che viene notificato?Dove e come registrare un oggetto per ricevere una notifica?

risposta

5

Viene inviato al centro di notifica, dove tutte le notifiche sono centralizzate. Un oggetto che vuole essere informato su questa notifica si registra al centro di notifica indicando quale notifica vuole essere informata e quale metodo deve essere invocato quando viene sollevata la notifica.

Per ulteriori informazioni è possibile dare un'occhiata a Notification programming topics for Cocoa e NSNotification class reference.

17

Da all'interno del codice di inizializzazione della classe che si desidera ricevere la notifica rendere il metodo seguente chiamata:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name: UIApplicationDidReceiveMemoryWarningNotification object:nil]; 

Questo presuppone che la classe implementa anche un metodo handleMemoryWarning come segue:

- (void) handleMemoryWarning:(NSNotification *)notification 
{ 
} 
+4

Non dimenticare di chiamare removeObserver nel dealloc di quella classe. – Abizern

+0

Impossibile modificare. Il selettore dovrebbe essere @selector (handleMemoryWarning :) – DougW

+0

Ho dimenticato di utilizzare inizialmente il tag del codice: risolto. – m4rkk

5

Molto più semplice usare l'applicazione delegare e implementare il metodo opzionale

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 

Le notifiche più comuni sono anche disponibili tradotte in chiamate a un delegato, in genere a metodi facoltativi in ​​un protocollo formale. Il tuo delegato può essere qualsiasi oggetto tu voglia.

+0

Si noti come si ottiene il nome del delegato prendendo il nome della notifica e rimuovendo l'interfaccia utente dal principio, "Notifica" dalla fine e downcasing della prima lettera. – Abizern

0

Stai attento che il tuo selettore dovrà prendere la notifica come argomento.

Se si utilizza qualcosa come @selector (handleMemoryWarning) e - (void) handleMemoryWarning {} l'oggetto NON invierà la notifica e manterrà ancora tutta la memoria.

Sono stato appena morso da questo.

+1

Totalmente non vero (e l'ho appena provato anche io). Puoi usare il selettore senza parametri o con parametri. Usa anche "hardware -> simula avviso di memoria" nel simulatore iOS. –

+0

Davvero? Lo hai testato su tutti i dispositivi e le versioni del sistema operativo? Ho assistito a questo accadendo di prima mano nel mio codice durante i test. –

+0

Ciao Ben, non dubito che l'hai visto su qualche dispositivo e versione del sistema operativo. Detto questo, non ho mai visto 'performSelector' preoccuparsi di un param o meno. Qualche idea su quale dispositivo e versione del sistema operativo fosse? –

Problemi correlati