我有AVPlayer的View Controller(例如B)用于播放音乐。问题是,我通过执行segue并传递播放列表对象(歌曲列表)从另一个(在例如A)VC中打开这个视图控制器。第一次一切都工作得很好,但是当我再次执行segue(不是解开segue)到A VC时,不知何故(我相信)B VC仍然具有旧值并且在内存中(?)。当我点击另一个播放列表并执行segue到B VC时,它开始播放来自新播放列表的音乐,并且不知何故音乐开始从旧播放列表播放,我得到两个AVPlayers,我甚至无法杀死它。如果我重复这一步,AVPlayers的数量会不断增加。
所以,问题是(它不是关于我的代码,所以不需要那样):
执行segue会杀死最后一个VC实例吗?(?)?
如果没有,我应该如何呈现新VC并将变量传递给它?
答案 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> >&’