簡體   English   中英

iOS:如果將強委托設置為self,則不會調用dealloc

[英]iOS : dealloc is not getting called if strong delegate set to self

說,我有一個UIView類型的類(例如“ MyClass”),我在其中聲明了一個用於類委托的,用於處理事件的類型(nonatomic, strong)類型(nonatomic, strong)的屬性,該類將觸發該類。

應用程序啟用了ARC,並且在我發現一些有趣的東西時工作得很好,我在我的一個視圖控制器(說TempViewController)中放置了dealloc,在其中我將MyClass委托設置為self 每當我從TempViewController彈出時,它都應該調用其dealloc方法,但不是。 我不知道為什么,但是不知道,我為其他類放了dealloc,它們都被調用了。

然后我發現它沒有在TempViewController中調用,因為我已經設置了MyClass委托。 我也對其他類進行了測試,然后停止調用dealloc。

后來我更改,將屬性委托給, assign而不是strong ,盡管它再次可以正常工作。

我發現的另一種解決方案是,通過在viewDidDisappear設置nil (就像我們對MKMapViewUIWebView所做的那樣),它將為同一TempViewController類調用dealloc。

是什么原因引起的? 有什么幫助,建議嗎?

這也意味着您仍在保留或引用Another類的屬性,並且編譯器無法為該類調用dealloc方法。 如果完成,則將其設置為nil,或者為其指定一個弱引用。 嘗試也閱讀這個答案

這是因為您聲明該屬性為strong ,然后將其更改為weak

@property (nonatomic, weak) id<yourprotocol> delegate;

如果您將強大的財產授予您的代表,則會增加保留人數。 當您從導航隊列彈出時,它也會減少保留數。 因此,即使you pop視圖控制器,它也可以通過委托(如果強大)來保留計數。 您的dealloc僅在保留計數為0時得到調用

注意:在“消失”中將nil設置為委托時,通過setter method分配的委托decrease保留計數,並將nil分配給委托。 這就是為什么當設置為nil時它會被調用。

所以,你可以聲明委派為weak

@property (nonatomic, weak) id<Protocol> delegate;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM