2009-09-06 4 views
0

누군가 IRC에 따르면 plist 파일의 직렬화/직렬화 해제를 위해 어디에서나 문자열을 지정할 필요가없는 방식으로 plist 파일에서 직접 객관적인 c 개체를 만들 수 있다고 말했습니다.plist 파일에서 직접 objective c 객체를 어떻게 만듭니 까?

누구든지이 작업을 수행하는 방법을 알고 있습니까? 내가 좋아하는 것

은 단순히이

<array> 
    <object> 
    <id>my unique id</id> 
    <description>first items description</description> 
    </object> 
</array> 

같은 PLIST를 어떻게 든 리터럴 문자열 "설명"또는 어디서나 코드에서 "ID"를 지정할 필요없이 직접 목적 C 객체로이를 역 직렬화합니다.

이것은 가능하지 않을 수도 있지만 온라인 또는 SO를 할 수없는 곳에서 찾을 수 없습니다.

또한 IRC 사람이 말한 것을 따라하고 싶었지만 그에게 그에게 질문 할 시간이 없었습니다. 어떤 도움이 크게 감사합니다

,

-Vandelizer

답변

4

당신은 클래스의 직렬화를 찾고 있습니다. 애플은 객체 보관 방법에 대해 here 가이드를 가지고 있습니다. 검색을위한 일부 키워드는 "아카이브" "NSCoder"및 "직렬화"입니다.

기본적으로 클래스에 NSCoding 인터페이스를 구현하게하고 싶습니다. 그런 다음 -(void)encodeWithCoder:(NSCoder*)coder- (id)initWithCoder:(NSCoder *)coder 메서드를 만듭니다. 전자는 데이터 쓰기 용이고 후자는 데이터에서 개체를 만듭니다. 이러한 메소드를 구현하는 방법은 "객체 인코딩 및 디코딩"단원을 참조하십시오.

그런 다음 파일에 쓸 때 개체의 NSArray를 만들고 파일에 배열을 쓰려면 [NSKeyedArchiver archiveRootObject:toFile:]을 호출하고 파일을 읽으려면 [NSKeyedUnarchiver unarchiveObjectWithFile:]을 호출합니다.

1

아카이버에는 두 가지 종류가 있습니다. 객체 그래프를 유지하는 '멍청한'것, 그리고 시간이 지남에 따라 데이터 구조가 진화하는 것을 허용하는 '열쇠가있는'것. 보관 된 요소 유형을 지속 된 저장 시간과 분리 할 수 ​​있기 때문에 키순 아카이버가 훨씬 더 나은 선택입니다.

1

개체의 직렬화를 검색 할 수도 있고 그렇지 않을 수도 있습니다. XML plist에서 값을 읽고 그 안에있는 값이 모두 유효한 plist 유형이면 XML을 NSString으로 채우고 -propertyList 메시지를 보냅니다. 당신은 이드를 돌려받을 것인데, 그 유형은 문제의 plist에 무엇이 달려 있는지에 달려 있습니다.

  • 은 (Id)를 propertyList의 는 최상위 요소에 따라있는 NSString,을 NSData, NSArray를하거나 NSDictionary에 객체를 반환하는 프로퍼티리스트의 텍스트 표현으로 상기 수신기를 해석해.
2

plist는 정의에 따라 배열, 사전, 문자열, 실수, 정수, 부울, 날짜 및 데이터 유형 중 하나를 포함합니다. true plist를 사용하는 경우 포함 된 객체를 한 줄의 코드로 인스턴스화 할 수 있습니다. NSPropertyListSerialization 방법을 참조하십시오

propertyListFromData:mutabilityOption:format:errorDescription

이진 속성 목록은, 어떤 객체를 포함 할 수 있으며, 기록 할 수 있으며, NSKeyedArchiver와 NSKeyedUnarchiver를 사용하여 읽을.이들을 사용하려면 NSCoding 프로토콜을 채택해야합니다. 여기에는 NSObject를 상속하고 userId와 userEmail의 두 가지 속성을 가진 객체의 메소드에 대한 예제가 있습니다.

+ (void) initialize 
    { 
     [self setVersion:1]; // increment when you object format changes (add or remove properties) 
    } 

    - (id) initWithCoder:(NSCoder *)coder 
    { 
     if (self = [super init]) 
     { 
      NSInteger storedClassVersion = [coder versionForClassName:NSStringFromClass([self class])]; 
      self.userId = [coder decodeObjectForKey:@"userid"]; 
      self.userEmail = [coder decodeObjectForKey:@"useremail"]; 
      if (storedClassVersion > 1) 
      { 
       // Use this block to conditionally read properties in versions greater than 1 
      } 
     } 
     return self; 
    } 

    - (void) encodeWithCoder:(NSCoder *)coder 
    { 
     [coder encodeObject:self.userId forKey:@"userid"]; 
     [coder encodeObject:self.userEmail forKey:@"useremail"]; 
    } 

아카이브 할 때 보관할 모든 개체를 NSDictionary로 마무리하는 것이 좋습니다. 이렇게하면 저장을 취소 할 때 키별로 개별 개체를 찾을 수 있습니다. NSDictionary는 NSCoding 프로토콜을 지원하므로 그렇게하기가 쉽습니다.

관련 문제