2012-02-15 111 views
6

我正在爲我的iPhone應用程序開發一個類,我希望它註冊並瞭解應用程序狀態更改(UIApplicationDidEnterBackgroundNotification等)。有沒有辦法註冊一個類的通知,而不必在內存中保存一個實例化的對象?我只是想讓適當的通知調用這個類來初始化,做一些事情,然後再次離開內存。我可以註冊NSNotifications類嗎?我可以在NSNotifications中使用類方法嗎?

現在我已經中init方法如下:

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

而且這種方法在其他地方類的.m文件:

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

applicationDidLoad下一次實例化類,但由於我沒有做任何事情,所以我認爲ARC會在內存中殺死對象,當我關閉它時,應用會崩潰(沒有任何有用的錯誤代碼,請介意)。如果我將handleEnteredBackground切換爲帶有「+」號的類方法,則在關閉應用程序時會出現無效的選擇器錯誤。

最終目標是在應用程序的生命週期中實例化一個類,讓它能夠響應應用程序狀態更改,而無需在類之外添加任何其他代碼。假設iOS 5 + Xcode 4.2+

回答

3

您應該查看singletons

您可以輕鬆創建持續貫穿整個應用程序生命週期的對象。

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

現在,您可以撥打[[YourObserverClass sharedObserver] startObserving],你不必擔心其保留等

+0

這聽起來像一個偉大的解決方案......我給它一個鏡頭和接受的答案,一旦我有機會嘗試一下出來了! – Amos 2012-02-15 22:49:14

+0

沒問題。如果您有更多問題,請在此寫下。 – hwaxxer 2012-02-15 23:10:11

17

下面應該工作:

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

的選擇本身:

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

您不必註銷觀察者,因爲不能處理類對象定位或以其他方式銷燬如果您需要註銷其他原因觀察者,您可以:

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

Costique:Xcode不會讓我使用[self class]作爲觀察者在課程中註冊 - 它告訴我「接收類型'',例如消息沒有用選擇器'' – Amos 2012-02-16 15:18:40

+1

'@Amos Yes ,如果你在一個類方法中使用'NSNotificationCenter'註冊,使用'self'而不是'[self class]',原因是'self'是指實例方法內類的一個實例,以及類對象裏面的類方法 – Costique 2012-02-16 15:28:42

+0

@Amos:什麼?哪個調用是你得到這個警告的? – user102008 2012-06-08 19:50:33

相關問題