首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Deinit从未调用过

Deinit从未调用过
EN

Stack Overflow用户
提问于 2014-11-17 19:11:58
回答 13查看 67.5K关注 0票数 61

我正在创建一个ViewController对象并将其推送到导航控制器。当对象从堆栈中弹出时-它没有被释放,Deinit也没有被调用。这可能是什么原因呢?

下面是推送的代码:

代码语言:javascript
复制
self.navigationController?.pushViewController(CustomViewController(), animated: true)

下面是弹出的代码:

代码语言:javascript
复制
 self.navigationController?.popViewControllerAnimated(true)
EN

回答 13

Stack Overflow用户

发布于 2015-11-07 15:30:43

我也遇到过类似的问题。我在类中添加了空的deinit方法,并添加了断点:

代码语言:javascript
复制
deinit {

}

因此它永远不会被调用。

一旦我在body中添加了一些代码,它就会按预期开始工作:

代码语言:javascript
复制
deinit {
    print("deinit called")
}

因此,请确保您的deinit方法不为空。

PS。我使用的是Swift 2,Xcode 7.1

票数 74
EN

Stack Overflow用户

发布于 2015-01-29 04:51:39

你的类或者它们包含的属性中有没有引用到你弹出的视图控制器?

如果你的UIViewController创建了一个对象的实例,这反过来又对该视图控制器进行了一个“强”引用(例如,一个没有显式声明为“弱”或“无主”的引用),并且你的视图控制器也保留了对该对象的强引用,那么这两个对象都不会被释放。这就是所谓的强参考循环,记录在这里(对于认真的Swift开发人员来说是一个必读的读物):

The Swift Programming Language (Swift 3.0.1): Automatic Reference Counting

闭包是一种更隐蔽的情况,在这种情况下可能会遇到麻烦。

作为实验,您可以尝试的一件事是在viewDidLoad或初始化中执行任何操作之前推入并弹出控制器,并查看是否调用了deinit方法。如果是,那么你应该能够逐渐发现你正在做的导致你所看到的症状的事情。

另一件可能阻碍诊断的事情(正如其他答案所指出的那样),这是我通过艰苦的方法学到的,那就是如果deinit方法不包含可执行语句,调试器断点将不会被用于deinit(),因为如果deinit调用为空,操作系统或编译器会优化deinit调用,所以如果您想验证deinit()是否被调用,至少要在那里放置一条print语句。

票数 55
EN

Stack Overflow用户

发布于 2015-05-20 16:54:43

我在给出的页面上使用了带有自定义序列的教程Custom TabBar。内存问题是由一个子视图引起的,这个子视图对父视图控制器有很强的引用。

代码语言:javascript
复制
class WBMNewsFeedV: UIView
{
   var parentVC:WBMHomeTabVC!
}

WBMNewsFeedV -子类

父类ViewController :WBMHomeTabVC

我将其更改为:

代码语言:javascript
复制
class WBMNewsFeedV: UIView
{
    weak var parentVC:WBMHomeTabVC!
}

因此,强引用嵌套在子视图中,一开始是不可见的。希望这对任何人都有帮助。更改后,总是调用deinit

WBMHomeTabVC

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26971415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档