2013-08-05 83 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問題。

相關問題