为数组创建引用而不是对象的副本

时间:2014-03-23 01:16:59

标签: objective-c

让我们说有5个歌曲对象,即Song *song1, *song2, *song3, *song4, *song5

现在共有三个班级Song, Playlist, MasterCollection

如名称所示,Song类可用于创建新歌,打印歌曲等。

Playlist课程可以创建新的播放列表并为其添加歌曲或删除歌曲。

MasterCollection包含一个播放列表列表和一个可用于创建所有歌曲库的方法。

我的问题是,我想定义我的方法,以便当从masterCollection的库中删除一首歌时,它也应该从播放列表中删除。

所以我做了类似的事。

我定义了一个名为mainCollection的MusicCollection类的新对象,并为其添加了歌曲。

[MainCollection.library addObject: song1];
[MainCollection.library addObject: song2];
[MainCollection.library addObject: song3];
[MainCollection.library addObject: song4];
[MainCollection.library addObject: song5];

我使用播放列表类创建了一个播放列表

[playlist1 addsong:mainCollection.library[0]];
[playlist1 addsong:mainCollection.library[3]];
[playlist1 addsong:mainCollection.library[2]];`

想法是在从mainCollection中删除song1时更新播放列表。

[mainCollection.librray removeObject: song1];

但是播放列表1没有更新。它仍然显示有3首歌曲。

有任何方法可以达到这个目的吗?

1 个答案:

答案 0 :(得分:1)

当你这样做时

[playlist1 addsong:mainCollection.library[0]];

Objective-C将mainCollection.library数组的元素置于索引零处,并将其引用添加到playlist1数组中。此时,song1对象有两个引用它的集合 - mainCollection.libraryplaylist1。这两个集合彼此独立,因此您无法操纵其中一个集合来更改另一个集合的内容。

有几种方法可以解决这个问题。

最常见的方法是删除对被删除歌曲的所有引用:它不是太昂贵,而且很容易实现。

另一种常见的方法是设置一个将歌曲连接到播放列表的集合 - 例如,NSMutableDictionarySong作为键(您需要实现哈希码和相等方法)和{{1 } NSMutableArray s作为元素。此集合会产生维护问题,但可以避免搜索不包含歌曲的播放列表。

最后,您可以使用"墓碑"图案。不是将歌曲存储在主列表和播放列表中,而是存储特殊的Playlist对象。除了SongReference的引用外,Song还可以有SongReference标记。您只需将isDeleted标记为已删除,而不是从大量集合中删除歌曲。不幸的是,你的其余代码将有一个任务要注意歌曲是否被删除。