执行segue时Swift杀死视图控制器

时间:2016-12-03 10:00:23

标签: ios swift segue

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

所以,问题是(它不是关于我的代码,所以不需要那样):

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

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

2 个答案:

答案 0 :(得分:3)

从未想过要保证单独回答;认为这可以在评论中轻松回答。但我不能让Amar在这里提供的答案中存在这个问题。这是错误的,在上下文中根本没有意义。

那说,为了回答你的问题,实例没有被杀的原因,因为你正在做的事情 - 在视图控制器上执行segues,构建一个看起来像这样的堆栈:

  

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

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

杀死B的是什么?好吧,只需从这个“堆栈”中“弹出”ping B的实例,就可以杀掉它。

你有:

  

A

您现在正在推动B

  

A - >乙

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

  

A

B是历史。请注意,在前一个持续推动的情况下,B是如何活着并且在唱歌。

在iOS中,有几种方法可以从此堆栈中弹出视图控制器。如果您在popViewController(:animated:)上构建此API,则会有UINavigationController等API。如果您以模态方式呈现视图控制器,则有dismissViewController(:animated:completion:)。当然,还有声明的展开segues帮助您弹出视图控制器。

答案 1 :(得分:-1)

你应该将玩家控制器对象为零,或者使用视图控制器进行玩家对象周引用。或者你可以检查每次创建或不创建vc实例

 error: no match for ‘operator=’ (operand types are ‘std::map<std::basic_string<char>, std::map<int, std::basic_string<char> > >::mapped_type {aka std::map<int, std::basic_string<char> >}’ and ‘void*’)
       TOKEN_VAR '=' '{' Exp "}" {myMap[$1]=$4; mapForSave.clear();}
                                                 ^
   note: candidate is:
    In file included from /usr/include/c++/4.8/map:61:0,
    /usr/include/c++/4.8/bits/stl_map.h:264:7: note: std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = int; _Tp = std::basic_string<char>; _Compare = std::less<int>; _Alloc = std::allocator<std::pair<const int, std::basic_string<char> > >]
           operator=(const map& __x)
           ^
    /usr/include/c++/4.8/bits/stl_map.h:264:7: note:   no known conversion for argument 1 from ‘void*’ to ‘const std::map<int, std::basic_string<char> >&’