我正在创建一个ViewController对象并将其推送到导航控制器。当对象从堆栈中弹出时-它没有被释放,Deinit也没有被调用。这可能是什么原因呢?
下面是推送的代码:
self.navigationController?.pushViewController(CustomViewController(), animated: true)下面是弹出的代码:
self.navigationController?.popViewControllerAnimated(true)发布于 2015-11-07 15:30:43
我也遇到过类似的问题。我在类中添加了空的deinit方法,并添加了断点:
deinit {
}因此它永远不会被调用。
一旦我在body中添加了一些代码,它就会按预期开始工作:
deinit {
print("deinit called")
}因此,请确保您的deinit方法不为空。
PS。我使用的是Swift 2,Xcode 7.1
发布于 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语句。
发布于 2015-05-20 16:54:43
我在给出的页面上使用了带有自定义序列的教程Custom TabBar。内存问题是由一个子视图引起的,这个子视图对父视图控制器有很强的引用。
class WBMNewsFeedV: UIView
{
var parentVC:WBMHomeTabVC!
}WBMNewsFeedV -子类
父类ViewController :WBMHomeTabVC
我将其更改为:
class WBMNewsFeedV: UIView
{
weak var parentVC:WBMHomeTabVC!
}因此,强引用嵌套在子视图中,一开始是不可见的。希望这对任何人都有帮助。更改后,总是调用deinit
WBMHomeTabVC
https://stackoverflow.com/questions/26971415
复制相似问题