保留代表是否可以?

时间:2013-08-05 19:41:50

标签: iphone ios ipad memory delegates

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

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

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

代码:

MusicPlayerViewController有:

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

查看控制器,其中将从云存储文件夹中加载歌曲,当点击单元格(歌曲)时会调用此歌曲:

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

2 个答案:

答案 0 :(得分:2)

保留(持有强烈引用)代表没有根本问题。这是不寻常的,但不是前所未有的。 NSURLConnection做到了。它创建了一个保留循环,如果管理得当,它会非常有用。您可以确保对象以确定的方式释放其委托,以便保留循环中断。

但是......你在这里讨论的具体情况听起来就像你有一个MVC问题而且你的视图控制器正在做一些不应该做的事情。

  

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

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

答案 1 :(得分:0)

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

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