我有一个视图控制器(用于登录),它定义了删除观察者的deinit方法.当用户点击Register按钮时,控制器调用performSegueWithIdentifier来加载注册视图控制器.我定义了deinit方法来删除所有观察者.但是,该方法未被调用.我在某处读到它是因为viewcontroller没有被销毁而且指向它的指针被保存在某处.有谁可以解释这背后的原因?
谢谢
编辑:虽然我同意评论部分提供的链接持有相同的问题,但没有答案或明确的答案.最高的upvoted回复建议在deinit中定义一些内容而不是留空.这并没有回答我正在寻找的探索.出于这个原因,我一直保持这个问题,直到有人能够指出我的理解是不正确的.而且,我确实认为马特简明扼要地解释了它.
deinit
在预期时未能触发的通常原因是您有一个保留周期,阻止您的视图控制器不存在.
(有时原因是你希望视图控制器在这种情况下被销毁是不正确的.但假设它是正确的,保留周期就是原因.)
你提到删除所有观察者.什么样的观察者?如果我们谈论的是NSNotification,那通常就是如何获得保留周期.通知中心会保留观察者,直到您取消注册.因此,你不能得到deinit
,直到之后的观察者已被删除.因此,你不能删除观察者在 deinit
.