2012-02-15 10 views
6

Pracuję nad klasą dla mojej aplikacji na iPhone'a i chcę ją zarejestrować i mieć świadomość zmian stanu aplikacji (UIApplicationDidEnterBackgroundNotification itd.). Czy istnieje sposób rejestrowania klasy powiadomień bez konieczności przechowywania instancji w pamięci? Po prostu chcę, aby odpowiednie powiadomienia wywoływały klasy, aby zainicjować, zrobić kilka rzeczy, a następnie ponownie opuścić pamięć.Czy mogę zarejestrować klasę NSNotification? Czy mogę używać metod klas z NSNotifications?

Teraz mam następujący w metodzie Init:

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

i ta metoda gdzie indziej w pliku .m klasy:

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

I instancji klasy raz pod applicationDidLoad, ale ponieważ nie robię z tym nic, zakładam, że ARC zabija obiekt z pamięci, a aplikacja zawiesza się (bez użytecznych kodów błędów, pamiętajcie), kiedy idę go zamknąć. Jeśli zmienię handleEnteredBackground na metodę klasy ze znakiem "+", po zamknięciu aplikacji pojawią się nieprawidłowe błędy selektora.

Ostatecznym celem jest utworzenie klasy jeden raz w całym cyklu życia aplikacji i umożliwienie reagowania na zmiany stanu aplikacji bez dodatkowego kodu poza zajęciami. Załóżmy, że iOS 5 + Xcode 4.2+

Odpowiedz

3

Powinieneś zajrzeć do singletons.

Możesz łatwo utworzyć obiekt, który przetrwa cały cykl życia aplikacji.

+ (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 
} 

Teraz można zadzwonić [[YourObserverClass sharedObserver] startObserving] i nie trzeba się martwić o utrzymanie go itp

+0

To brzmi jak świetne rozwiązanie ... Postaram się o odpowiedź i przyjmuję odpowiedź, gdy tylko będę miał okazję jej wypróbować na zewnątrz! – Amos

+0

Bez problemu. Napisz tutaj, jeśli masz więcej pytań. – hwaxxer

17

Poniższy powinno działać:

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

selektora samego:

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

Nie musisz wyrejestrowywać obserwatora, ponieważ obiekt klasy nie może być dealerem zlokalizowane lub w inny sposób zniszczone. Jeśli musisz wyrejestrować obserwatora z innych powodów, możesz:

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

Costique: Xcode nie pozwoli mi użyć [self class], aby zarejestrować się jako obserwator z klasy - mówi mi "Otrzymany typ" "na przykład wiadomość nie deklaruje metod z selektorem" ' – Amos

+1

@Amos Tak , jeśli zarejestrujesz się z 'NSNotificationCenter' w metodzie klasy, użyj' self' zamiast '[self class]'. Powód jest taki, że 'self' odnosi się do instancji klasy wewnątrz metod instancji i do obiektu klasy metody klasy wewnętrznej: – Costique

+0

@Amos: z jakiego wywołania otrzymujesz to ostrzeżenie? – user102008