2013-08-05 176 views
1

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

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

该解决方案是否可以接受?

代码:

MusicPlayerViewController有:

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

视图控制器中的歌曲会从云存储文件夹中加载了此呼吁细胞(歌曲)螺纹时:

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

回答

2

保留(强烈参照)代表没有根本问题。这是不寻常的,但并非前所未有的。 NSURLConnection做到了。它创建了一个保留循环,如果管理得当,它可能非常有用。这取决于你确保对象以确定性的方式释放其委托,以便保留循环被打破。

但是......你在这里讨论的具体案例听起来像你有一个MVC问题,你的视图控制器正在做一些它不该做的事情。

我将该委托分配给该ViewController,因此即使从视图中将它推出,它仍留在内存中,因此音乐播放器可以播放下一首和前一首歌曲。

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

+0

感谢您的建议,停留在内存中的ViewController是一个DropboxViewController,它从Dropbox存储中提取数据,并为播放器创建流式链接,这就是为什么我很难创建一些智能MVC模式,您有一些想法也许? – vburojevic

+0

如果他们设计他们的视图控制器来管理自己的网络流量,这是不幸的。修复它可能没有太多。他们应该有一个独立于视图控制器的'DropboxController'。 –

0

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

如果代表强壮,除非Musicplayer被释放,并且在大多数情况下ViewController在视图不再使用时应该被释放,否则ViewController将不会被释放。正如Rob提到的,你似乎有一个MVC问题。

相关问题