2009-10-29 7 views
6

처음에는 이것이 작동 할 것이라고 생각했지만, 이제는 artistCollection이 "아티스트"객체의 NSMutableArray이기 때문에 이해하지 못할 것입니다.개체의 NSMutableArray를 디스크에 저장/쓰기 하시겠습니까?

@interface Artist : NSObject { 
    NSString *firName; 
    NSString *surName; 
} 

내 질문은 최고의 디스크에 기록하는 방법 "아티스트"오브젝트의 내 NSMutableArray를 내가 그들에게 내 응용 프로그램을 실행할 때로드 할 수 있도록이 무엇입니까? 한 최종 것은

artistCollection = [[NSMutableArray alloc] init]; 

newArtist = [[Artist alloc] init]; 
[newArtist setFirName:objFirName]; 
[newArtist setSurName:objSurName]; 
[artistCollection addObject:newArtist]; 

NSLog(@"(*) - Save All"); 
[artistCollection writeToFile:@"/Users/Fgx/Desktop/stuff.txt" atomically:YES]; 

편집

많은 감사, 나는 궁금합니다. "아티스트"에 추가 객체 (응용 프로그램)의 NSMutableArray (softwareOwned)라는 추가 인스턴스 변수가 포함 된 경우이를 처리하기 위해 인코딩을 어떻게 확장합니까? NSCoding을 "Applications"객체에 추가 한 다음 "Artist"를 인코딩하기 전에 인코딩 할 것인가, 아니면 "Artist"에서 이것을 지정하는 방법이 있습니까?

@interface Artist : NSObject { 
    NSString *firName; 
    NSString *surName; 
    NSMutableArray *softwareOwned; 
} 

@interface Application : NSObject { 
    NSString *appName; 
    NSString *appVersion; 
} 

많은 감사

게리

+0

이 편집에 대답하려면 :이와

@interface Artist : NSObject <NSCoding> { NSString *firName; NSString *surName; } @end @implementation Artist static NSString *FirstNameArchiveKey = @"firstName"; static NSString *LastNameArchiveKey = @"lastName"; - (id)initWithCoder:(NSCoder *)decoder { self = [super init]; if (self != nil) { firName = [[decoder decodeObjectForKey:FirstNameArchiveKey] retain]; surName = [[decoder decodeObjectForKey:LastNameArchiveKey] retain]; } return self; } - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:firName forKey:FirstNameArchiveKey]; [encoder encodeObject:surName forKey:LastNameArchiveKey]; } @end 

, 당신은 컬렉션을 인코딩 할 수 있습니다 당신의 응용 프로그램 클래스 NSCoding를 구현 아티스트의 encodeWithCoder : 및 initWithCoder :에서 변경 가능한 배열의 인코딩/디코딩을 처리하는 줄을 추가합니다. 자체적으로 인코딩하라는 요청을 받으면 배열은 Application 객체가 자신을 인코딩하도록 요청합니다. –

+0

아, 알았어, 완벽, 고마워. 올레. – fuzzygoat

답변

18

writeToFile:atomically:을위한 연습 문제로 남겨 코코아의 컬렉션 클래스는 속성 목록, 즉 NSString, NSNumber, 다른 컬렉션 등과 같은 표준 개체를 포함하는 컬렉션에만 적용됩니다.

jdelStrother's answer에 대해 자세히 컬렉션에 포함 된 모든 개체가 자체적으로 보관할 수있는 경우 NSKeyedArchiver을 사용하여 컬렉션을 보관할 수 있습니다. 사용자 정의 클래스를 위해이를 구현하기 위해,이 NSCoding 프로토콜을 준수합니다

NSData* artistData = [NSKeyedArchiver archivedDataWithRootObject:artistCollection]; 
[artistData writeToFile: @"/Users/Fgx/Desktop/stuff" atomically:YES]; 
9

는 NSKeyedArchiver를 살펴 보자. 간단히는 :

NSData* artistData = [NSKeyedArchiver archivedDataWithRootObject:artistCollection]; 
[artistData writeToFile: @"/Users/Fgx/Desktop/stuff" atomically:YES]; 

당신은 encodeWithCoder를 구현해야합니다 : 당신의 아티스트 클래스에 - 볼 Apple's docs

보관 취소 (NSKeyedUnarchiver 참조) 독자 :)에서

관련 문제