2014-06-07 91 views
2

我想使用NSNotificationCenter與斯威夫特,我遇到了問題。我想以下幾點:NSNotification永遠不會被髮送

class MyClass { 

    init() { 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "stopTimer", name: UIApplicationDidEnterBackgroundNotification, object: []) 
    } 

    func stopTimer() { 
     println("Entered background!") 
    } 
} 

當擊中home鍵,觀察者永遠不會調用選擇,因此永遠不會被打印我的消息了。

注意,我在最後發送一個空的對象,爲addObserver方法簽名期待一個隱式地展開的對象,並且當該應用程序進入背景它在EXC_BAD_ACCESS誤差設置爲nil結果。

任何想法?

編輯

我忘了提及此代碼正在從包括在我的項目的框架中執行。

執行代碼給我一個糟糕的訪問中止信號。

enter image description here

+0

我用nil代替了[],它對我很有用 – Adam

+0

你不是「在最後發送一個空對象」。 '[]'是一個數組 - 不是嗎? – matt

+0

是的,空數組,它是一個對象。 –

回答

3

好的,我想通了。 2個問題:

  • 有我的類是不延長NSObject

現在沒有強引用我的類的實例在我的應用程序

  • ,我可以設置object: nil,一切工作正常。

    感謝您的幫助! :)

  • 3

    你應該能夠通過零的可選參數。你能否詳細說明如果你這樣做會發生什麼?這對我有用:

    func init() { 
        super.init() 
    
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "stopTimer", name: UIApplicationDidEnterBackgroundNotification, object: nil) 
    } 
    
    func stopTimer() { 
        println("Entered background!") 
    } 
    
    deinit { 
        NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 
    
    +0

    我沒有使用超類,不需要'super.init()'。 –

    +0

    糟糕,是的,當我測試它時,我使用了一個超類。仍然應該使用「nil」參數。如果你發送一個空的數組(「[]」),那麼你會得到一個崩潰,因爲stopTimer函數不能帶參數。 – Dash

    +1

    你確定當你去背景的時候,類實例還沒有被釋放嗎?這聽起來像是對stopTimer的調用嘗試訪問一個錯誤的地址,比如已經被垃圾回收的對象實例。我添加了防止這種情況發生的deinit代碼。 – Dash

    1

    也許你應該嘗試實施applicationDidEnterBackground(application: UIApplication)而不是?

    要進一步排除故障,您可能還需要嚮應用程序代理的deinit添加日誌語句,以查看委託在進入後臺後是否被釋放。

    相關問題