如何跟踪和控制哪些视图取消分配?

时间:2013-12-23 22:37:52

标签: ios objective-c uiviewcontroller avplayer dealloc

启动我的应用后,它会以自定义UIViewController开始,其自定义UITableView具有自定义UITableViewCells。细胞可以播放视频等。我正在使用AVPlayerAVPlayerLayer来播放视频。这个初始视图控制器还有一个菜单弹出窗口,可以将您带到另一个控制器。单击另一个菜单选项时,初始UIViewController取消分配。这是有目的的,并将新UIViewController设置为应用rootViewController。但是,如果我开始在初始viewController中的单元格中播放视频,然后单击菜单选项,视频将继续在后台播放,我仍然可以听到音频。

我简单地说

-(void)dealloc{
    NSLog(@"Initial controller deallocated");
}

在初始视图控制器中,当我将新控制器设置为root时,确认它是deallocs,并打印出来,但视频仍在继续播放。

我现在已经'覆盖'自定义-(void)dealloc和自定义UITableView的{​​{1}}(如上所述)方法,但这两种方法都没有。

我在这里简化了层次结构的解释,我相信可能还有其他连接保持在tableView上(主要是因为我不知道这种行为的任何其他原因)。

但是,我相信这些可能的连接都在初始视图控制器层次结构下,并且我理解视图控制器下的整个层次结构将在视图控制器执行时消失。 UITableViewCell是tableView和/或单元格不会dealloc的原因吗?播放的视频是通过互联网进行的,我还可以告诉应用程序在取消分配控制器后继续下载和缓冲视频。我已经尝试将播放器,播放器层和整个单元设置为AVPlayer,但它一直在下载,我认为我误解了一些连接。

首先,我认为nil(strong, nonatomic)的属性可能与这些属性有关。我不完全明白在哪里使用什么,所以我几乎完全使用它。在我正在阅读的内容中,(nonatomic, retain)对于其中一些引用似乎是正确的,但我也“害怕”这些含义,因为我并不完全理解它们。

其次,在我的自定义weak中,我有一个属性:UITableView

当我开始在特定单元格中播放视频时,就像这样;

@property CustomCell *playing;我也是这样做的:[someSpecificCell.player play];。现在我可以很容易地找到正在播放的单元格,I.E来阻止它。当我稍后尝试释放单元格时,我使用self.playing = someSpecificCell;,但是,这不会解除分配单元格。为什么不?我只是从tableView中删除引用?这是否意味着还有其他参考?

有没有办法查看这些引用来自哪里的列表?据我所知,所有引用都在同一个初始层次结构中,但不知何故,层次结构的某些部分仍处于活动状态他们的控制器解除分配后。


更新

我现在尝试使用Allocations工具启动 Instruments ,但我并不完全理解我所看到的内容。 我创建的层次结构是这样的:

self.playing = nil;

当我点击另一个菜单选项时,我创建另一个(几乎相同的)层次结构,将 new MyNavController(2)设置为应用程序的rootViewController。 “当前”层次结构现在将是

MyNavController1->MyViewController1->MyView1->MyTableView1->MyCell1->text&video etc.

当我呈现新的层次结构,并将此新层次结构设置为应用程序的rootViewController时,应该释放第一个层次结构。在MyNavController2->MyViewController2->MyView2->MyTableView2->MyCell2->something else -(void)dealloc的{​​{1}}中,MyNavController1打印出“已取消分配”,而MyViewController1NSLog();则不打印。

乐器中,它表示MyTableView1MyCell1,我猜这意味着第一次正确释放。 当我检查MyViewController的字段时,它显示#living: 1, #transient: 1,我猜这意味着tableView没有被解除分配,正如我之前的“研究”所发现的那样。 但是,在显示MyTableView的两个实例的列表中,它表​​示第一个tableView(应该被释放,但不是)的负责调用者是第一个#living: 2, #transient: 0,这是确认已取消分配。这是什么意思?

如果我进一步点击此特定MyTableView(第一个)的地址字段,则会显示:

MyViewController1

这究竟意味着什么,我能找到可能的参考资料吗?

0 个答案:

没有答案