1

我有一個對象,我創建了一個訂閱了一些NSNotificationCenter通知的對象,但它正在被釋放,因爲我沒有指向實例的指針。實例化具有一個委託,它將調用一個方法返回到我擁有的另一個類,所以我覺得沒有必要爲它指定一個指針,因爲指針不起任何作用。iOS:釋放正在使用的對象(ARC)

基本上,我有一個類的實例,DelegateListener(名稱僅用於示例目的),它訂閱了一些默認的NSNotificationCeneter的通知。實例化結束後,此實例化不會分配給任何指針。然而,實例化具有屬性delegate。在實例化過程中,我爲該委託分配了一個值。該委託實現了我希望DelegateListener在其訂閱的通知被觸發時調用的方法。

這樣做的問題是我創建的DelegateListener的實例化被釋放,除非我將它分配給一個保留的指針。有沒有辦法避免在ARC中自動釋放我的DelegateListener實例?

回答

3

如果您沒有多個實例,您應該將DelegateListener實例存儲在一個靜態變量中。

我覺得沒有必要也有指向它的指針,因爲指針不起任何作用。

該指針(或至少應該)服務於一個目的:當你不再需要聽的通知,您應該接受他們退訂DelegateListener。至少,這應該發生在應用程序轉到後臺時(除非它的要點是執行後臺處理),以及應用程序何時終止。

[[NSNotificationCenter defaultCenter] removeObserver:delegateListener]; 
+0

我有委託返回到零,我退訂dealloc通知。但是你說我應該保持我的靜態指針,因爲它是唯一的方法,呵呵。 – RileyE

+0

那麼,如果它退訂'dealloc',那麼當ARC清理它時,它將會退訂。所以你的委託變得毫無用處。保留一個靜態指針,然後在你想要取消訂閱時將偵聽器設置爲'nil',你的'dealloc'會照顧它。 – darvids0n

+0

@darvidsOn所以,當沒有指針,但它擁有一個委託給一個保留的類,它會自動釋放?這不是很煩人嗎? – RileyE