NSKeyedArchiver

2875 단어
  • 대상이 NSString, NSDictionary, NSArray, NSData, NSNumber 등 유형이면 NSKeyedArchiver로 직접 압축 및 복구
  • 모든 대상이 직접 이런 방법으로 압축할 수 있는 것은 아니며 NSCoding 프로토콜을 준수한 대상만 가능
  • NSCoding 프로토콜에는 2가지 방법이 있습니다
  • .
  • encodeWithCoder:
  • 압축 파일을 보관할 때마다 이 방법을 사용합니다.일반적으로 이 방법에서 압축 대상의 모든 실례 변수를 지정하면 encodeObject:forKey: 방법 압축 실례 변수
  • 를 사용할 수 있습니다.
  • initWithCoder:
  • 파일에서 대상을 복구할 때마다 이 방법을 사용합니다.일반적으로 이 방법에서 파일의 데이터를 디코딩하는 방법을 대상으로 하는 실례 변수를 지정합니다.decodeObject:forKey 방법으로 실례 변수를 디코딩할 수 있습니다

  • Foundation 프레임워크의 객체 아카이빙

  • NSArray 객체를 Documents/array로 아카이빙합니다.archive
  • NSArray *arr = [NSArray arrayWithObjects:@”a”,@”b”,nil];
    [NSKeyedArchiver archiveRootObject:arr toFile:path];
    
  • NSArray 객체 복구(디코딩)
  • NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    

    사용자 정의 객체 아카이빙

  • NSCoping 프로토콜 준수
  • // 
    - (void)encodeWithCoder:(NSCoder *)encoder {
        // 
        [super encodeWithCode:encode];
        [encoder encodeObject:self.name forKey:@"name"];
        [encoder encodeInt:self.age forKey:@"age"];
        [encoder encodeFloat:self.height forKey:@"height"];
    }
    // 
    - (id)initWithCoder:(NSCoder *)decoder {
        // 
        self = [super initWithCoder:decoder];
        self.name = [decoder decodeObjectForKey:@"name"];
        self.age = [decoder decodeIntForKey:@"age"];
        self.height = [decoder decodeFloatForKey:@"height"];
        return self;
    }
    
  • 아카이브 사용자 지정 객체
  • // ( )
    Person *person = [[Person alloc] init];
    person.name = @"rh";
    person.age = 100;
    person.height = 1.83f;
    [NSKeyedArchiver archiveRootObject:person toFile:path];
    
  • 사용자 지정 객체 압축 해제
  • // ( )
    Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    

    NSData와 함께 여러 사용자 지정 객체 아카이빙

  • archiveRootObject:toFile: 방법은 한 대상을 한 파일에 직접 쓸 수 있지만, 때로는 여러 대상을 같은 파일에 쓰려고 할 수도 있으니 NSData를 사용하여 압축 파일을 작성해야 한다
  • 다중 객체 아카이브
  • // ( )
    //  
    NSMutableData *data = [NSMutableData data];
    //  NSKeyedArchiver 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    //  , NSMutableData 
    [archiver encodeObject:person1 forKey:@"person1"];
    [archiver encodeObject:person2 forKey:@"person2"];
    //  ( )
    [archiver finishEncoding];
    //  
    [data writeToFile:path atomically:YES];
    
  • 다중 객체 압축 해제
  • // ( )
    //  
    NSData *data = [NSData dataWithContentsOfFile:path];
    //  , NSKeyedUnarchiver 
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    Person *person1 = [unarchiver decodeObjectForKey:@"person1"];
    Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
    //  
    [unarchiver finishDecoding];
    

    좋은 웹페이지 즐겨찾기