Ios 我如何跟踪和控制哪些视图解除分配?
当我的应用程序启动时,它从一个自定义Ios 我如何跟踪和控制哪些视图解除分配?,ios,objective-c,uiviewcontroller,avplayer,dealloc,Ios,Objective C,Uiviewcontroller,Avplayer,Dealloc,当我的应用程序启动时,它从一个自定义UIViewController和一个自定义UITableView和一个自定义UITableViewCells开始。细胞可以播放视频等。我正在使用AVPlayer和AVPlayerLayer播放视频。此初始视图控制器还具有一个菜单弹出窗口,可以将您带到另一个控制器。单击另一个菜单选项时,初始的UIViewController解除分配。这是故意的,并将新的UIViewController设置为应用程序rootViewController。但是,如果我开始在初始v
UIViewController
和一个自定义UITableView
和一个自定义UITableViewCells
开始。细胞可以播放视频等。我正在使用AVPlayer
和AVPlayerLayer
播放视频。此初始视图控制器还具有一个菜单弹出窗口,可以将您带到另一个控制器。单击另一个菜单选项时,初始的UIViewController
解除分配。这是故意的,并将新的UIViewController
设置为应用程序rootViewController
。但是,如果我开始在初始viewController中的单元格中播放视频,然后单击菜单选项,视频将在后台继续播放,我仍然可以听到音频
我只是简单地说
-(void)dealloc{
NSLog(@"Initial controller deallocated");
}
在初始视图控制器中,确认当我将新控制器设置为root时它解除锁定,并打印出来,但视频仍在播放
我现在已经“覆盖”了自定义UITableView
和自定义UITableViewCell
的-(void)dealloc
(如上)方法,但这两种方法都没有触发
我已经在这里简化了对层次结构的解释,我相信可能还有其他连接保持着tableView(主要是因为我不知道这种行为的任何其他原因)
但是,我相信这些可能的连接都在初始视图控制器层次结构下,并且我的理解是,当视图控制器这样做时,视图控制器下的整个层次结构将消失。AVPlayer
是否是tableView和/或单元格无法解除锁定的原因?视频是通过互联网播放的,我还可以看出,在控制器解除分配后,应用程序会继续下载和缓冲视频。我曾尝试将播放器、播放器层和整个手机设置为nil
,但它一直在下载,我想我误解了一些连接
首先,我认为(强,非原子)
或(非原子,保留)
的属性可能与这些有关。我不完全明白在哪里使用什么,所以我几乎只使用这个。在我所阅读的内容中,weak
似乎对其中一些引用是正确的,但我也“害怕”其中的含义,因为我不完全理解它们
其次,在我的自定义UITableView
中,我有一个属性:@property CustomCell*playing代码>
当我开始在一个特定的单元中播放视频时,就像这样
[someSpecificCell.player play]我也这样做:self.playing=someSpecificCell代码>。现在我可以很容易地找到正在播放的手机,即停止播放。当我稍后尝试取消分配单元格时,我使用self.playing=nil代码>,但是,这不会取消分配单元格。为什么不呢?我只是从tableView中删除引用吗?这是否意味着还有其他参考资料
有没有办法查看这些引用的位置列表?据我所知,所有引用都在相同的初始层次结构中,但在控制器解除分配后,层次结构的某些部分仍然保持活动状态
更新
我现在尝试使用分配工具启动工具,但我不完全理解我看到的是什么。
我创建的层次结构如下所示:
MyNavController1->MyViewController1->MyView1->MyTableView1->MyCell1->text&video etc.
当我单击另一个菜单选项时,我创建了另一个(几乎相同的)层次结构,将newMyNavController(2)设置为应用程序的rootViewController。“当前”层次结构现在将是
MyNavController2->MyViewController2->MyView2->MyTableView2->MyCell2->something else
当我呈现新的层次结构,并将此新层次结构设置为应用程序的rootViewController时,第一个层次结构应该被释放。在MyNavController1
和MyViewController1
的-(void)解除锁定中,用NSLog()打印“解除锁定”代码>,而MyTableView1
和MyCell1
中没有任何内容
在Instruments中,它说MyViewController
是#living:1,#transient:1
,我猜这意味着第一次交易是正确的。
当我检查MyTableView
字段时,它会显示#living:2,#transient:0
,我猜这意味着tableView没有被解除分配,正如我之前的“研究”发现的那样。
但是,在显示MyTableView
的两个实例化的列表中,它指出第一个tableView(应该解除分配,但不是)的负责调用方是第一个MyViewController1
,该调用方已确认解除分配。这是什么意思
如果我进一步单击此特定的MyTableView
(第一个)的地址字段,它会显示:
# Event Type ΔRefCt: RefCt ... Responsible Caller
0 Malloc +1 1 ... 'MyViewController1'
这到底意味着什么?我能找出可能的参考文献存放在哪里吗?您是否尝试过在工具中使用分配工具?这将是一个很好的起点。您可以看到应用于对象的所有保留和释放的列表,告诉您为什么它仍在内存中设置self.playing为nil,只是将指针设置为nil,但单元格仍然是保留它的表视图的子视图。查看表视图代码以了解如何添加播放机会很有帮助。@rdelmar哦,好的,所以我不会将单元格的实际值设置为nil,谢谢。显示tableView代码需要很多时间,因为它的代码很多,而且有些凌乱。自定义单元格正在添加播放器,而不是tableView。既然我提到了它,我记得在单元格、tableView和控制器之间创建了一些委托方法,用于启动和处理视频。。我去看看。即便如此,我还是觉得奇怪,当初始控制器更改时,并不是所有引用都被删除。圣诞节后我会看看Patrick Goley的建议,