1

我在我的应用程序中偶然发现了一个问题,我的音乐播放器视图控制器需要保留委托(这是一个基于云的歌曲存储)来保留歌曲播放列表,直到选择新文件夹中的歌曲。

因此,当用户在某个文件夹中点击一首歌曲时,我将代理分配给该 ViewController,因此即使从视图中推送它,它也会保留在内存中,以便音乐播放器可以播放下一首和上一首歌曲。但是当用户从另一个文件夹(ViewController)中选择歌曲时,我将音乐播放器委托设置为 nil,并将委托分配给新的 ViewController。

这个解决方案可以接受吗?

代码:

MusicPlayerViewController 有:

@property (nonatomic, strong) id <MusicPlayerViewDelegate> delegate;

当点击单元格(歌曲)时,将从云存储文件夹中加载歌曲的视图控制器具有此调用:

musicPlayerViewController.delegate = nil;
musicPlayerViewController.delegate = self;
4

2 回答 2

2

保留(强烈引用)代表没有根本问题。这是不寻常的,但并非史无前例。NSURLConnection可以。它创建了一个保留循环,如果管理得当,它会非常有用。您需要确保对象将以确定性的方式释放其委托,从而打破保留循环。

但是......您在这里讨论的具体情况听起来像是您遇到了 MVC 问题,并且您的视图控制器正在做不应该做的事情。

我将代理分配给该 ViewController,因此即使从视图中推送它,它也会保留在内存中,以便音乐播放器可以播放下一首和上一首歌曲。

如果您说除非某个视图控制器在内存中,否则您无法播放音乐,那么视图控制器可能有不正确的责任。视图控制器应该管理视图。这应该与实际播放音乐无关。请参阅https://stackoverflow.com/a/5228317/97337,了解如何在 MVC 中拆分音乐播放系统。

于 2013-08-05T20:07:00.263 回答
0

在您提出的示例中,考虑到音乐播放器保持相同的实例并且视图控制器被设置/取消设置为不同的东西,委托实际上应该很弱。

如果委托很强大,除非 Musicplayer 被释放,否则您的 Viewcontroller 将不会被释放,并且在大多数情况下,Viewcontroller 应该在其视图不再使用时被释放。正如 Rob 提到的,您似乎遇到了 MVC 问题。

于 2013-08-05T20:17:50.673 回答