1

私は演習を行っています.SongsとPlaylistの2つのクラスがあります。プログラムでは曲をプレイリストに入れることができ、すべて正常に動作していますが、すべての通常のプレイリストにあるすべての曲でマスタープレイリストを作成する必要があります.問題があります。

ここにコードがあります

    //
//  main.m
//  MyItunes
//
//  Created by Rodrigo López on 6/29/12.
//  Copyright (c) 2012 ITQ. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Songs.h"
#import "PlayList.h"

int main (int argc, const char * argv[])
{

    @autoreleasepool {

        Songs *mySong1 = [Songs new];
        Songs *mySong2 = [Songs new];
        Songs *mySong3 = [Songs new];
        PlayList *myPlayList1=[[PlayList alloc]initWithName:@"First"];
        PlayList *myPlayList2=[[PlayList alloc]initWithName:@"Second"];


[mySong1 setTitle:@"Back In Black" setArtist:@"AC/DC" setAlbum:@"Back In Black"               setPlayt:@"4:16"];
[mySong2 setTitle:@"Medicate" setArtist:@"AFI" setAlbum:@"Crash Love" setPlayt:@"4:21"];
[mySong3 setTitle:@"Rucci" setArtist:@"Austin TV" setAlbum:@"La ultima noche" setPlayt:@"4:39"];

        [myPlayList1 addSong:mySong1];
        [myPlayList1 addSong:mySong2];
        [myPlayList2 addSong:mySong3];

        [myPlayList1 showPlayList];
        [myPlayList2 showPlayList];

         [myPlayList1 showPlayList];
         [myPlayList1 showAllSongs];

       }
    return 0;
}

    //
//  PlayList.m
//  MyItunes
//
//  Created by Rodrigo López on 6/29/12.
//  Copyright (c) 2012 ITQ. All rights reserved.
//

#import "PlayList.h"



@implementation PlayList


@synthesize playListarray,playListName;




-(id) initWithName: (NSString *) name  
{
  if(self)
  { 
    playListName = [NSString stringWithString: name]; 
    playListarray = [NSMutableArray array];
    playlistMaster=[NSMutableArray array ];
  }
    return self;
}




-(void) addSong: (Songs *) theSong
{



    [playListarray addObject:theSong];  

    [playlistMaster addObject:theSong];  

}

-(void) showPlayList
{
     NSLog(@"Play List: %@", self.playListName);
    for(Songs *theSong in playListarray)
    {
        NSLog(@"%@", theSong.title);
    }


}

-(void) showAllSongs
{
    NSLog(@"Play List: Master");
    for(Songs *theSong in playlistMaster)
    {
        NSLog(@"%@", theSong.title);
    }
}



-(NSUInteger) entries 
{
    return [playListarray count]; 
}

-(void) remove: (Songs *) theSong 
{

    [playListarray removeObjectIdenticalTo:theSong];
}


@end

問題は NSMutable 配列にあります。配列をグローバルに宣言したいのですが、その方法がわかりません。このプログラムの出力は次のとおりです。

2012-06-29 19:24:06.061 MyItunes[17184:707] Play List: First
2012-06-29 19:24:06.080 MyItunes[17184:707] Back In Black
2012-06-29 19:24:06.083 MyItunes[17184:707] Medicate
2012-06-29 19:24:06.084 MyItunes[17184:707] Play List: Second
2012-06-29 19:24:06.085 MyItunes[17184:707] Rucci
2012-06-29 19:24:06.089 MyItunes[17184:707] Play List: First
2012-06-29 19:24:06.090 MyItunes[17184:707] Back In Black
2012-06-29 19:24:06.091 MyItunes[17184:707] Medicate
2012-06-29 19:24:06.091 MyItunes[17184:707] Play List: Master
2012-06-29 19:24:06.092 MyItunes[17184:707] Back In Black
2012-06-29 19:24:06.093 MyItunes[17184:707] Medicate

プレイリスト マスターに Rucci の曲がありません。お役に立てれば幸いです。ありがとうございます。

4

1 に答える 1

0

Objective C Static Class Level variablesで説明されているように、playlistMaster を PlayList 実装ファイルの「静的変数」にします。他のメソッドの外側で .m ファイルを宣言して初期化するだけです。(保管をお忘れなく。)

また、PlayList クラスにはいくつかのメモリの問題があることにも注意してください。特に、初期化コードは次のようなメンバー変数を保持する必要があります。

-(id) initWithName: (NSString *) name
{
    if (self = [super init]) {
        playListName = [[NSString stringWithString: name] retain];   // NOTE:  You could also do:  [[NSString alloc] initWithString: name];
        playListarray = [[NSMutableArray array] retain];    // NOTE:  You could also do:  [[NSMutableArray alloc] init];
        playlistMaster = [[NSMutableArray array] retain];    // ditto
    }
    return self;
}

これを行う場合dealloc、これらのそれぞれを解放するメソッドを追加する必要があります。しかし、そうしないと、それらを使用しようとする前に解放される可能性があります。

于 2012-06-30T00:47:56.277 に答える