Ios 执行segue时的Swift kill视图控制器

Ios 执行segue时的Swift kill视图控制器,ios,swift,segue,Ios,Swift,Segue,我有视图控制器(在ex.B中)和AVPlayer,用于播放音乐。问题是,我通过执行segue并传递playlist对象(歌曲列表),从另一个(例如A)VC打开这个视图控制器。第一次一切都很好,但当我再次对VC执行segue(而不是放松segue)时,不知何故(我相信)VC仍然保留着旧的值,并且在内存中(?)。当我点击另一个播放列表并执行segue to B VC时,它开始播放新播放列表中的音乐,不知何故,音乐开始播放旧播放列表中的音乐,我得到了两个我甚至无法杀死的AVPlayer。如果我重复这一

我有视图控制器(在ex.B中)和AVPlayer,用于播放音乐。问题是,我通过执行segue并传递playlist对象(歌曲列表),从另一个(例如A)VC打开这个视图控制器。第一次一切都很好,但当我再次对VC执行segue(而不是放松segue)时,不知何故(我相信)VC仍然保留着旧的值,并且在内存中(?)。当我点击另一个播放列表并执行segue to B VC时,它开始播放新播放列表中的音乐,不知何故,音乐开始播放旧播放列表中的音乐,我得到了两个我甚至无法杀死的AVPlayer。如果我重复这一步,AVP玩家的数量会不断增加

所以,问题是(这与我的代码无关,所以不需要):

执行segue是否会杀死最后一个VC实例(?)


如果没有,我应该如何呈现新的VC并将变量传递给它?

您应该将玩家控制器对象设置为nil或使用视图控制器将玩家对象设置为week引用。也可以检查每次创建的vc实例是否为新实例

import UIKit

var instanceCount: Int = 0 //

class MayBeAClassHere { 
}

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
    var inViewController = instanceCount 
    inViewController++ // inViewController is a brand new COPY
    println(inViewController) // print  1
    println(instanceCount) // print 0
}
}

从来没有想过这需要一个单独的答案;我认为这很容易在评论中得到回答。但我不能让这个问题在阿马尔提供答案的情况下存在。这是错误的,在上下文中毫无意义

也就是说,为了回答您的问题,实例没有被杀死的原因是因为,您所做的方式——在视图控制器上执行分段,构建了一个如下所示的堆栈:

A->B->A->B->A->B

如果您还记得堆栈数据结构,这与将元素“推”到“视图控制器堆栈”上是一样的。此设计“要求”视图控制器的所有实例都保留在内存中。这就解释了为什么音乐不会停止

什么杀死了
B
?那么,简单地说,从这个“堆栈”中“弹出”ping
B
的实例,就可以杀死它

你有:

A

您现在正在按
B

A->B

现在,如果您想返回到
B
。你弹出
B
。现在堆栈看起来像这样

A

B
是历史记录。请注意,在上一个连续按压的情况下,
B
是如何活动和歌唱的


在iOS中,有几种方法可以从这个堆栈中弹出视图控制器。如果您是在
UINavigationController
上构建此应用程序,则存在类似于
popViewController(:animated:)
的API。如果您以模式显示视图控制器,则会有
dismissViewController(:animated:completion:)
。当然,也有一些规定的展开段可以帮助您弹出视图控制器

嗯,为什么要表演一段新的音乐?为什么不放松一下呢?同意用户@avismara,这是返回
dismis
pop
的推荐方式。当你从A切换到B时,你不会杀死它。一个仍然留在堆栈中。如果你想从B转到A,你应该使用“放松”序列导航回来。如果你想通过杀死A来从A到B,那么你应该有一个定制的容器视图来实现这一点