2013-08-22 3 views
4

NSKeyedArchiver로 생성 된 plist 인 OS X 응용 프로그램의 프로젝트 파일이 있습니다. 프로그래밍 방식으로 한 문자열을 변경해야합니다.디코딩 한 다음 NSKeyedArchiver로 알 수없는 클래스를 인코딩 하시겠습니까?

기본적으로 NSDictionary 개체에는 Foundation 클래스가 포함되어 있습니다. 하지만 하나의 맞춤 클래스 (GradientColor)가 있습니다. 나 자신을 정의하고 initWithCoder :와 encodeWithCoder에서 아무 작업도하지 않고 시도했지만 새로 생성 된 프로젝트 파일을 읽으려고 대상 응용 프로그램이 충돌합니다. 따라서 초기화 할 때 nil 값을 올바르게 처리 할 수 ​​없습니다.

initWithCoder : (NSCoder *) aDecoder를 사용하여 클래스를 초기화 할 때 내 클래스에 해당하는 키를 어떻게 든 알 수 있습니까?

+0

.. :

가 여기에 내가 NSKeyedArchive의 내부 구조에 대한 좋은 게시물을 발견, 그것은 나에게 많은 도움이 –

답변

1

해당 클래스 (GradientColor)의 구현이 복원되었습니다. 사실, 데이터의 정말 작은 금액을 저장합니다

@interface GradientColor : NSView <NSCoding> { 
    float location; 
    NSColor *color; 
} 
@end 

@implementation GradientColor 
- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder encodeFloat:location forKey:@"location"]; 
    [aCoder encodeObject:color forKey:@"color"]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super init]; 
    if (self) { 
     location = [aDecoder decodeFloatForKey:@"location"]; 
     color = [aDecoder decodeObjectForKey:@"color"]; 
    } 
    return self; 
} 
@end 

내 버전은 아무것도하지 않습니다 만, 직렬화 및 원래의 구현으로 제대로 직렬화 복원합니다. 나는 plist 자체에서 필요한 키와 유형을 찾았습니다. 이제 CLI 유틸리티가 유효한 프로젝트 파일을 생성합니다. 난 당신이 읽기/동일 데이터를 기록 할 수있는 사용자 정의 클래스의 구현을해야 할 것입니다 생각 http://digitalinvestigation.wordpress.com/2012/04/04/geek-post-nskeyedarchiver-files-what-are-they-and-how-can-i-use-them/