2013-12-18 20 views
-1

假设,你的.h文件看起来像这样:两个相互的NSMutableArray对象的变化

@property (retain, nonatomic) NSMutableArray *songs; 
- (NSMutableArray *)popularSongs; 
- (void)make20PercentDiscountToPopularSongs 

你.m文件看起来是这样的:

- (NSMutableArray *)popularSongs 
{ 
    NSMutableArray *popularSongs = [NSMutableArray array]; 

    for (Song *song in self.songs) { 

     if (song.isPopular) { 

      [popularSongs addObject:song]; 
     } 
    } 

    return popularSongs; 
} 

- (void)make20PercentDiscountToPopularSongs 
{ 
    for (Song *song in self.popularSongs) { 

     song.price = song.price * 0.8; 
    } 
} 

上面的代码增加了20%的折扣流行歌曲。我承认有一个更简单的方法来做到这一点。您可以在一个函数中使用“make20PercentDiscountToPopularSongs”和“popularSongs”函数,但假设代码是按照上面所写的方式编写的。

在上面的例子中,将行:

song.price = song.price * 0.8; 

其实,做任何修改对象:

@property (retain, nonatomic) NSMutableArray *songs; 

与否?因为,好像该行会更改新创建的流行歌曲NSMutableArray而不是歌曲NSMutableArray,对吗?这个问题现在困扰了我很多时间。 我想对原始歌曲数组进行更改。对我来说,popularSongs的功能就像存储指向歌曲数组中歌曲的指针一样。

+0

好奇,为什么歌曲上没有“流行”标志或“排名”字段?那么你只需要一个你可以排序和过滤的数组。 – BergQuester

+0

另外,假设流行歌曲的对象是两个数组中的相同对象,则只需更改一次该值。 – BergQuester

+0

辉煌但让我们坚持上面的范例。 –

回答

3

它不改变数组。它更改了songs阵列中的一些对象。并且,由于popularSongs数组中返回的对象相同,因此它们也会“更改”。

此:

[popularSongs addObject:song]; 

添加指针当前歌曲到阵列。它不创建歌曲的新副本。

+0

这应该是正确的答案。您将歌曲对象的指针分配给流行歌曲数组。如果您对流行歌曲对象进行了更改,它也会在歌曲数组中更改。 – Hackmodford

0

您可以创建一个快捷可变数组是这样的:

NSMutableArray *popularSongs = self.songs.mutableCopy; 

而不是通过所有歌曲迭代,以确定它们是否受欢迎,你可以在创建阵列时使用的过滤器谓词。

NSMutableArray *popularSongs = [[self.songs filteredArrayUsingPredicate: 
[NSPredicate predicateWithFormat:@"isPopular = %@", @YES]] mutableCopy]; 

有了这一个班轮你可以完全避免你的方法; - ) - 不知道你想要什么,但如果你想改变的原创歌曲,离开了mutableCopy部分。

+1

可变拷贝数组不拷贝内容,它只复制数组(它是一个浅拷贝)。 – Wain

相关问题