2013-12-18 32 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

相關問題