NSData 다루기 (바이너리 데이터 저장/복원)
아카이버 글에서 다뤘듯이,
NSData로 데이터를 저장/복원 할 때에도 NSKeyedArchiver, NSKeyedUnarchiver 클래스를 사용함.
1) 단일 객체 저장/복원
+(NSData *)archivedDataWithRootObject:(id)rootObject; //NSData 형태로 받을 때
+(id)unarchiveObjectWithData:(NSData *)data; //NSData를 객체로 반환 받을 때
아카이버의 클래스 메소드를 이용.
로 클래스 메소드를 통해서 간단하게 가능하다.
2) 다수의 객체를 저장/복원
1)번과 같이 클래스 메소드로 가능하지 않음.
인코딩
1) NSMutableData 객체 생성
2) NSMutableData 객체를 인자로 아카이버 객체 생성.
3) 아카이버 객체를 통해 NSData로 인코딩하여 NSMutableData에 키-밸류 방식으로 하나씩 저장
4) 인코딩을 마치면 -(void)finishEncoding; 메소드를 호출하면 완료.
디코딩
1) NSData 객체를 인자로 NSKeyedUnarchiver 객체 생성.
-(id)initForReadingWithData:(NSData *)data;
2) 언아카이버 객체를 통해 NSData를 'key'에 맞게 디코딩하여 객체로 반환.
-(int)decodeIntForKey:(NSString *)key;
-(float)decodeFloatForKey:(NSString *)key;
-(id)decodeObjectForKey:(NSString *)key;
ex)
Rectangle 클래스 선언부 (Rectangle.h)
#import <Foundation/Foundation.h>
@interface Rectangle : NSObject <NSCoding> //인코딩이 필요한 클래스에서 NSCoding 프로토콜을 채택.
@property int width;
@property int height;
@end
Rectangle 클래스 구현부 (Rectangle.m)
#import "Rectangle.h"
@implementation Rectangle
-(void)encodeWithCoder:(NSCoder *)aCoder{ //NSCoding 프로토콜의 인코딩 메소드 작성
[aCoder encodeInt:_width forKey:@"WIDTH"];
[aCoder encodeInt:_height forKey:@"HEIGHT"];
}
//저장된 객체를 복원
-(id)initWithCoder:(NSCoder *)aDecoder{ //NSCoding 프로토콜의 디코딩 메소드 작성
self = [super init];
if(self){
//디코딩 후 멤버변수를 초기화하는 과정
_width = [aDecoder decodeIntForKey:@"WIDTH"];
_height = [aDecoder decodeIntForKey:@"HEIGHT"];
}
return self;
}
-(NSString *)description{
return [NSString stringWithFormat:@"사각형 - 가로,세로 (%d, %d)\n", _width, _height];
}
@end
실행 코드 (main.m)
#import <Foundation/Foundation.h>
#import "Rectangle.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//인코딩을 위한 아카이버 생성
NSMutableData *mdata = [NSMutableData data]; //NSMutableData 객체 할당
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mdata]; //아카이버 객체 생성/초기화
Rectangle *rec = [[Rectangle alloc] init];
rec.width = 10;
rec.height = 20;
NSLog(@"my Rectangle : %@",rec);
NSLog(@"Encoding Start ~!");
//데이터 인코딩
[archiver encodeInteger:777 forKey:@"INTEGER"]; //NSData형태로 인코딩 되어 NSMutableData인 mdata에 저장됨.
[archiver encodeObject:@"HELLO_WORLD_!" forKey:@"STRING"];
[archiver encodeObject:rec forKey:@"RECTANGLE"];
//인코딩 마무리
[archiver finishEncoding];
NSLog(@"Encoding Successed!\n\n");
//------------------------------------------------------------------------------//
//디코딩을 위한 언아카이버 생성
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:mdata];
NSLog(@"Decoding Start ~!");
//데이터 디코딩 (NSData -> 객체복원)
NSInteger num = [unarchiver decodeIntForKey:@"INTEGER"]; //NSData -> 정수 객체 반환
NSString *str = [unarchiver decodeObjectForKey:@"STRING"]; //NSData -> 문자열 객체 반환
Rectangle *rec2 = [unarchiver decodeObjectForKey:@"RECTANGLE"]; //NSData -> Rectangle 객체 반환
NSLog(@"my num : %ld", num);
NSLog(@"my String : %@", str);
NSLog(@"my Rectangle : %@",rec2);
NSLog(@"Finished ~!");
}
return 0;
}
==> 결과 :
2019-02-18 14:08:41.316084+0900 Study[8586:1413531] my Rectangle : 사각형 - 가로,세로 (10, 20)
2019-02-18 14:08:41.316307+0900 Study[8586:1413531] Encoding Start ~!
2019-02-18 14:08:41.316629+0900 Study[8586:1413531] Encoding Successed!
2019-02-18 14:08:41.316713+0900 Study[8586:1413531] Decoding Start ~!
2019-02-18 14:08:41.316811+0900 Study[8586:1413531] my num : 777
2019-02-18 14:08:41.316852+0900 Study[8586:1413531] my String : HELLO_WORLD_!
2019-02-18 14:08:41.316902+0900 Study[8586:1413531] my Rectangle : 사각형 - 가로,세로 (10, 20)
2019-02-18 14:08:41.316919+0900 Study[8586:1413531] Finished ~!
Program ended with exit code: 0
'Objective-C 기초' 카테고리의 다른 글
구조체 Struct (0) | 2019.02.18 |
---|---|
블록 (Block) (0) | 2019.02.18 |
아카이빙(Archiving) (0) | 2019.02.16 |
프로토콜 (Protocol) (0) | 2019.02.15 |
클래스 내부 구성요소 숨기기 (0) | 2019.02.15 |