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的建议,