国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

OC對象的歸檔及解檔淺析

2019-11-14 19:23:38
字體:
來源:轉載
供稿:網友

對象歸檔,就是把內存中對象持久化。

對象解檔,就是把持久化的對象讀取到內存。

oc中對象歸檔解檔大致分為以下幾種方法:

從數量上可以分為:

  1. 對單個對象歸檔解檔
  2. 對多個對象歸檔解檔

從對象的存在形式上可以分為:

  1. 系統對象歸檔解檔
  2. 自定義對象歸檔解檔

接下來逐一編寫代碼做簡單實現

1.單個系統對象歸檔及解檔:

void SingleSystemObject(){    NSArray *arr = [NSArray arrayWithObjects:@1,@"你好",@3, nil];        NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"array.txt"];    //對象歸檔    BOOL success = [NSKeyedArchiver archiveRootObject:arr toFile:filePath];    if (success) {        NSLog(@"歸檔成功");    }        //對象解檔    NSArray *arr2 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];        for (NSString *str in arr2) {        NSLog(@"%@",str);    }}

2. 多個系統對象歸檔及解檔

void MultiSystemObject(){    NSArray *arr = [NSArray arrayWithObjects:@1,@2,@"中文", nil];    NSInteger integer = 10;    BOOL archiverBool = YES;            /*------對象歸檔--------------------*/    NSMutableData *data = [NSMutableData data];        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];        //對多個對象編碼歸檔,key是解檔時對象的標識符,可任意編寫    //encode有多個重載,但并不是任何系統對象都有重載方法    [archiver encodeObject:arr forKey:@"arr"];    [archiver encodeInteger:integer forKey:@"integer"];    [archiver encodeBool:archiverBool forKey:@"archiverBool"];    //完成編碼    [archiver finishEncoding];        NSString *filepath = [NSHomeDirectory() stringByAppendingPathComponent:@"1.txt"];        //將data以原子操作方式寫入文件    BOOL success = [data writeToFile:filepath atomically:YES];        if (success) {        NSLog(@"歸檔成功");    }    /*------對象歸檔--------------------*/        /*------對象解檔--------------------*/    //將文件數據加載入NSData對象    NSData *data2 = [NSData dataWithContentsOfFile:filepath];        //使用NSData對象初始化接檔器    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data2];        //根據歸檔時的類型和key解檔對應數據    NSArray *arr2 = [unarchiver decodeObjectForKey:@"arr"];    NSInteger integer2 = [unarchiver decodeIntegerForKey:@"integer"];    BOOL unarchiveBool = [unarchiver decodeBoolForKey:@"archiveBool"];        NSLog(@"%@",arr2);    NSLog(@"%ld",integer2);    NSLog(@"%d",unarchiveBool);    /*------對象接檔--------------------*/}

3.自定義對象歸檔及解檔

自定義對象實現可歸檔解檔,需遵守NSCoding協議,該協議下有兩個方法需要實現,分別是

歸檔編碼

- (void)encodeWithCoder:(NSCoder *)aCoder

歸檔解碼

- (id)initWithCoder:(NSCoder *)aDecoder

此兩個方法中實現自定義對象中自定義成員變量歸檔時的編碼和解碼方式,類似于多系統對象歸檔的實現方式,即將成員變量按類型編碼并制定key,解碼時根據key按類型解碼并賦值給成員變量,最終將對象返回。簡單代碼實現如下:

Person.m

@interface Person : NSObject <NSCoding>@PRoperty (copy,nonatomic)NSString *name;@property (assign,nonatomic)NSInteger age;@end@implementation Person- (void)encodeWithCoder:(NSCoder *)aCoder{    [aCoder encodeObject:self.name forKey:@"name"];    [aCoder encodeInteger:self.age forKey:@"age"];}- (id)initWithCoder:(NSCoder *)aDecoder{//    self = [super init];//    if (self) {        self.name = [aDecoder decodeObjectForKey:@"name"];        self.age = [aDecoder decodeIntegerForKey:@"age"];//    }    return self;}- (NSString *)description{    NSString *desc = [NSString stringWithFormat:@"name = %@,age = %ld",self.name,self.age];    return desc;}@end

 歸檔解檔代碼:

void UserDefinedObject(){    Person *p = [[Person alloc] init];    p.name = @"yangys";    p.age = 10;        //歸檔    NSString *filepath = [NSHomeDirectory() stringByAppendingPathComponent:@"person.txt"];        BOOL success = [NSKeyedArchiver archiveRootObject:p toFile:filepath];        if (success) {        NSLog(@"歸檔成功");    }        //解檔    Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filepath];            NSLog(@"%@",person);}

自定義多個對象的歸檔及解檔如多個系統對象的歸檔及解檔。

這里值得一提的是,系統對象的歸檔及解檔中,只有遵守了NSCoding協議或其子協議的系統對象才可進行歸檔及解檔。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 翁牛特旗| 白玉县| 绥芬河市| 甘谷县| 瓦房店市| 榆树市| 崇州市| 贵德县| 元江| 岱山县| 株洲市| 辉南县| 福海县| 河池市| 前郭尔| 义马市| 育儿| 玉山县| 榆林市| 四子王旗| 绥中县| 苍山县| 梅州市| 应城市| 潮安县| 慈溪市| 永靖县| 元朗区| 昌宁县| 麻城市| 贵南县| 芜湖县| 营山县| 绥中县| 焦作市| 庆城县| 阜新| 眉山市| 舟山市| 化隆| 潞城市|