nskeyedarchiver - CSDN
精华内容
参与话题
  • 将各种类型的对象存储到文件中,而不仅仅是字符串、数组和字典类型,有一种更灵活的方法。就是利用NSKeyedAarchiver类创建带键(keyed)的档案来完成。 Mac OS X从版本10.2开始支持带键的档案。...

    将各种类型的对象存储到文件中,而不仅仅是字符串、数组和字典类型,有一种更灵活的方法。就是利用NSKeyedAarchiver类创建带键(keyed)的档案来完成。

    Mac OS X从版本10.2开始支持带键的档案。在此之前,要使用NSArchiver类创建连续的(sequential)归档。连续的归档需要完全按照写入时的顺序读取归档中的数据。

    在带键的归档中,每个归档字段都有一个名称。归档某个对象时,会为它提供一个名称,即键。从归档中检索该对象时,是根据这个键来检索的。这样可以按照任意的顺序将对象写入归档并进行检索。另外,如果向类添加了新的实例变量或删除了实例变量,程序也可以进行处理。

    注意:iPhone SDK中没有提供NSArchiver。如果想在iPhone上使用归档功能,则必须使用NSKeyedArchiver。

    代码示例如下:

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            //---------------使用NSKeyedArchiver归档(存储各种类型的对象数据)-------------
            //将字典数据写到文件glossary.archive中
            NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:
                                      @"A class defined so other class can inherit from it.",@"abstract class",
                                      @"To implement all the methods defined in a protocol.",@"adopt",
                                      @"Storing an object for later use.",@"archiving",
                                      nil
                                      ];
            [NSKeyedArchiver archiveRootObject:glossary toFile:@"glossary.archive"];
            
            //将文件glossary.archive中的数据读到字典对象并显示出来
            NSDictionary *readglossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"glossary.archive"];
            
            for(NSString *key in readglossary)
                NSLog(@"%@: %@",key,[readglossary objectForKey:key]);
        }
        return 0;
    }
    

    其中,

    [NSKeyedArchiver archiveRootObject:glossary toFile:@"glossary.archive"];
    将字典glossary写入到文件glossary.archive中。可以为该文件指定任何路径名。在本例中,文件被写入当前目录下。

    之后,又通过

    NSDictionary *readglossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"glossary.archive"];
    方法将创建的归档文件读入执行程序中。这个语句将指定的文件打开并读取文件的内容,该文件必须是以前归档操作的结果。可以为文件指定完整路径名或相对路径名。

    在显示结果之后,可以简单的通过枚举其内容来验证恢复是否成功。





    展开全文
  • 今天记录一下学习 NSKeyedArchiver、NSKeyedUnarchiver ,主要用在ios数据存储上,数据从内存存储到闪存上,这个过程称为归档。 一、创建一个数据模型(自定义类) 现在就以大家常见的Student的为例,这个模型...



    今天记录一下学习 NSKeyedArchiver、NSKeyedUnarchiver ,主要用在ios数据存储上,数据从内存存储到闪存上,这个过程称为归档。


    一、创建一个数据模型(自定义类)

    现在就以大家常见的Student的为例,这个模型有5个参数:name、age、weight、hobby、others


    Student.h

    #import <Foundation/Foundation.h>
    
    @interface Student : NSObject<NSCoding,NSCopying>
    
    @property(copy,nonatomic) NSString *name;
    @property(assign,nonatomic) int age;
    @property(assign,nonatomic) double  weight;
    @property(copy,nonatomic) NSArray *hobby;
    @property(copy,nonatomic) NSDictionary *others;
    
    
    
    @end

    Student.m

    #import "Student.h"
    
    
    #define knameKey @"name"
    #define kageKey @"age"
    #define kweightKey @"weight"
    #define khobbyKey @"hobby"
    #define kotherKey @"others"
    
    @implementation Student
    
    @synthesize name;
    @synthesize age;
    @synthesize weight;
    @synthesize hobby;
    @synthesize others;
    
    
    #pragma mark-NSCoding
    -(void)encodeWithCoder:(NSCoder *)aCoder{
    
    
        [aCoder encodeObject:name forKey:knameKey];
        [aCoder encodeInt:age forKey:kageKey];
        [aCoder encodeDouble:weight forKey:kweightKey];
        [aCoder encodeObject:hobby forKey:khobbyKey];
        [aCoder encodeObject:others forKey:kotherKey];
    
    }
    
    
    -(id)initWithCoder:(NSCoder *)aDecoder{
        
        if (self == [super init]) {
           name =  [aDecoder decodeObjectForKey:knameKey];
           age = [aDecoder decodeIntForKey:kageKey];
           weight =  [aDecoder decodeDoubleForKey:kweightKey];
           hobby =  [aDecoder decodeObjectForKey:khobbyKey];
           others =  [aDecoder decodeObjectForKey:kotherKey];
        }
        
        return self;
    }
    
    
    
    #pragma mark-NSCopying
    -(id)copyWithZone:(NSZone *)zone{
        Student *copy = [[[self class] allocWithZone:zone] init];
        copy.name = [self.name copyWithZone:zone];
        copy.age = self.age;
        copy.weight = self.weight;
        copy.hobby = [self.hobby copyWithZone:zone];
        copy.others = [self.others copyWithZone:zone];
        
        return copy;
    }
    
    
    @end

    通过以上的代码我们可以看出,要实现对数据模型的归档,需要我们实现NScoding协议,NScoping(copy协议是为了模型数据可以复制,对于归档而言,不是必须要实现)

    NScoding协议需要实现两个方法:

    -(void)encodeWithCoder:(NSCoder *)aCoder    以keyValue形式对基本数据类型Encoding

    -(id)initWithCoder:(NSCoder *)aDecoder      以keyValue形式对基本数据类型Decoding,返回数据模型本身

    -(id)copyWithZone:(NSZone *)zone      NScopying协议的方法,目的为了实现数据模型的copy,如下实例:

        Student *s1 = [[Student alloc] init];
        Student *s2 = [s1 copy];
        NSLog(@"s1:%@",s1);
        NSLog(@"s2:%@",s2);

    Log控制台输出:

    2013-06-16 16:19:36.157 ArchiveDemo[1357:c07] s1:<Student: 0x8875340>

    2013-06-16 16:19:36.158 ArchiveDemo[1357:c07] s2:<Student: 0x8875360>



    二、ViewController.xib添加几个针对数据模型的可编辑组件:





    三、接下来就是在Viewcontroller.m中的操作,首先添加一个内部使用的方法,返回要保存到闪存的位置:

    -(NSString *) getFilePath{
    
        NSArray *array =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        
         return [[array objectAtIndex:0] stringByAppendingPathComponent:kFileName];
        
    }


    在ViewDidLoad方法里,每次viewController初始化时,读取路径下的归档文件,读取数据模型数据。同时添加一个通知每当按下Home键时,数据及时归档到闪存中。

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        if ([[NSFileManager defaultManager] fileExistsAtPath:[self getFilePath]]) {
            NSLog(@"filePAth:%@",[self getFilePath]);
            
            NSData *data = [[NSData alloc] initWithContentsOfFile:[self getFilePath]];
            
            NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
            
            //解档出数据模型Student
            Student *mStudent = [unarchiver decodeObjectForKey:kDataKey];
            [unarchiver finishDecoding];//一定不要忘记finishDecoding,否则会报错
     
            //接档后就可以直接使用了(赋值到相应的组件属性上)
            self.nameLabel.text = mStudent.name;
            self.ageLabel.text = [NSString stringWithFormat:@"%d",mStudent.age];
            self.weightLabel.text = [NSString stringWithFormat:@"%f",mStudent.weight];
            self.hobbyTextField.text = [mStudent.hobby objectAtIndex:0];
            self.othersTextView.text = [mStudent.others objectForKey:@"other"];
            
            [unarchiver release];
            [data release];
        }
        
        //添加一个广播,用于注册当用户按下home键时,归档数据到闪存中
        UIApplication *app = [UIApplication sharedApplication];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveAppDataWhenApplicationWillResignActive) name:UIApplicationWillResignActiveNotification object:app];
        
    }


    四、某一操作需要保存数据的时候,及时归档到闪存中

    /**
     *当用户按下Home键,返回桌面时,归档当前数据到指定文件路径下
     */
    -(void) saveAppDataWhenApplicationWillResignActive:(NSNotification*) notification{
        
        Student *saveStudent = [[Student alloc] init];
        saveStudent.name = self.nameLabel.text;
        saveStudent.age = [self.ageLabel.text intValue];
        saveStudent.weight = [self.weightLabel.text doubleValue];
        saveStudent.hobby = [NSArray arrayWithObjects:self.hobbyTextField.text, nil];
        saveStudent.others = [NSDictionary dictionaryWithObjectsAndKeys:self.othersTextView.text,@"other",nil];
        
        NSMutableData *data = [[NSMutableData alloc] init];
        
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        
        [archiver encodeObject:saveStudent forKey:kDataKey];
        
        [archiver finishEncoding];
        
        [data writeToFile:[self getFilePath] atomically:YES];
        [data release];
        [archiver release];
        [saveStudent release];
        
    
    }


    运行效果:

    重新运行后:


    归档这种保存方式缺点就是没有属性列表(NSuserDefault)速度快,因为它每次都要把文件保存到闪存中,优点是可以创建自己想要的数据模型,然后统一以模型方式存储,比属性列表要过分依赖Key要省心。


    目前就记录这么多,以后再有的话再补充,如果有什么错误欢迎大家指出,一起学习,进步。




    展开全文
  • 归档 NSKeyedArchiver NSKeyedUnarchiver

    归档与反归档需要NSCoding协议的支持, 需要编解码的自定义对象的类也要支持该协议。

    NSCoding协议:

    - (void) encodeWithCoder : (NSCoder *) aCoder;

    - (id) initWithCoder:(NSCoder *) aDecoder;


    NSKeyedArchiver,NSKeyedUnarchiver类支持NSCoder协议:

    - (void)encodeObject:(nullable id)objv forKey:(NSString *)key;

    - (nullable id)decodeObjectForKey:(NSString *)key;


    协议支持示例代码(user,childUser,teacher属性分别为类User,ChildUser,Teacher的对象,User,ChildUser和Teacher类均实现了NSCoding协议):

    其中,如果encodeObject:forKey和deCodeObjectForKey的对象如果是自定义的类的话,则该自定义类也要实现NSCoding协议来支持对其编解码,如果是NSObject等类对象的话,这些类本身支持了编解码(NSObject支持编解码,但是不支持NSCoding协议,因此基类是NSObject不能调用基类的编解码方法)。encodeWithCode和initWithCoder方法中的归档与反归档的对象必须成对出现,否则持久化就会出错。注意这个方法中,如果父类也支持NSCoding协议,一般会调用基类的encodeWithCoder和initWithCoder方法。

    <p class="p1"><span class="s1">- (</span><span class="s2">void</span><span class="s1">)encodeWithCoder:(</span><span class="s3">NSCoder</span><span class="s1"> *)aCoder{</span></p><p class="p2"><span class="s1"> </span><span class="s4" style="font-family: Menlo;">    [aCoder </span><span class="s1" style="font-family: Menlo;">encodeObject</span><span class="s4" style="font-family: Menlo;">:</span><span class="s1" style="font-family: Menlo;">_user</span><span class="s4" style="font-family: Menlo;"> </span><span class="s1" style="font-family: Menlo;">forKey</span><span class="s4" style="font-family: Menlo;">:</span><span class="s5" style="font-family: Menlo;">@"user"</span><span class="s4" style="font-family: Menlo;">];</span></p><p class="p3"><span class="s4">    [aCoder </span><span class="s1">encodeObject</span><span class="s4">:</span><span class="s1">_childUser</span><span class="s4"> </span><span class="s1">forKey</span><span class="s4">:</span><span class="s5">@"childUser"</span><span class="s4">];</span></p><p class="p3"><span class="s4">    [aCoder </span><span class="s1">encodeObject</span><span class="s4">:</span><span class="s1">_teacher</span><span class="s4"> </span><span class="s1">forKey</span><span class="s4">:</span><span class="s5">@"teacher"</span><span class="s4">];</span></p><p class="p1"><span class="s1">}</span></p><p class="p2"><span class="s1"></span>
    </p><p class="p1"><span class="s1">- (</span><span class="s2">id</span><span class="s1">)initWithCoder:(</span><span class="s3">NSCoder</span><span class="s1"> *)aDecoder{</span></p><p class="p3"><span class="s4">    </span><span class="s1">_user</span><span class="s4"> = [ aDecoder </span><span class="s1">decodeObjectForKey</span><span class="s4">:</span><span class="s5">@"user"</span><span class="s4">];</span></p><p class="p3"><span class="s4">    </span><span class="s1">_childUser</span><span class="s4"> = [ aDecoder </span><span class="s1">decodeObjectForKey</span><span class="s4">:</span><span class="s5">@"childUser"</span><span class="s4">];</span></p><p class="p3"><span class="s4">    </span><span class="s1">_teacher</span><span class="s4"> = [aDecoder </span><span class="s1">decodeObjectForKey</span><span class="s4">:</span><span class="s5">@"teacher"</span><span class="s4">];</span></p><p class="p4"><span class="s4">    </span><span class="s1">return</span><span class="s4"> </span><span class="s1">self</span><span class="s4">;</span></p><p class="p1"><span class="s1">}</span></p>


    ChildUser方法中的NSCoding协议支持如下,由于调用了super::encodeWithCoder,因此基类和派生类编辑码的键名不可以重名,如果重名,归档的话,后面的会覆盖前面的:

    - (void)encodeWithCoder:(NSCoder *)aCoder{
        
        [super encodeWithCoder:aCoder];
        [aCoder encodeObject:_name2 forKey:@"name"];
        return;
    }
    
    - (id)initWithCoder:(NSCoder *)aDecoder{
        
        self = [super initWithCoder:aDecoder];
        
        _name2 = [ aDecoder decodeObjectForKey:@"name"];
        return self;
    }


    调用方法:

        // 测试NSKeyedArchiver键名重名

        UserGroup *userGroup = [[UserGroup alloc] init];

        NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

        NSString *fileDirectory = [pathArray objectAtIndex:0];

        NSString *filePath = [fileDirectory stringByAppendingPathComponent:@"test.txt"];

        //归档

        BOOL bSuccess = [NSKeyedArchiver archiveRootObject:userGroup toFile: filePath];

        //反归档

        UserGroup *userGroup2 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

         开始测试时归档失败,是因为NSSearchPathForDirectoriesInDomains第二个参数设置为了NSLocalDomainMask,这个参数得到的目录,不是沙盒内部,没有写权限。


    经测试,不同的对象内部的属性的键名重名是没有问题的,只有同一个对象中的基类和派生类属性编解码时键名不可重名(基类和派生类的property也不可重名)。

    归档文件时也可以使用NSData辅助来实现,如下:
    NSMutableData *tempData = [NSMutableData data];  
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:tempData];  
    [archiver encodeObject:userGroup forKey:@"root"];  <span style="font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px; background-color: rgb(248, 248, 248);">//可以编、解码多个</span>
    [archiver finishEncoding];  
      
    if (![tempData writeToFile:dataFilePath atomically:YES]) {  
        NSLog(@"fail to archive data object");  
    }  

    反归档:
    NSData *tempData = [NSData dataWithContentsOfFile:dataFilePath];  
    if (tempData) {  
        // 通过解码恢复对象  
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:tempData];  
        UserGroup userGroup = <span style="margin: 0px; padding: 0px; border: none; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px; background-color: rgb(248, 248, 248);">[unarchiver decodeObjectForKey: @"root"</span><span style="margin: 0px; padding: 0px; border: none; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px; background-color: rgb(248, 248, 248);">];  //可以编、解码多个</span>
        [unarchiver finishDecoding];  

    上述通过NSData方式操作数据可以实现深复制,如下:

    NSData *tempData = [NSKeyedArchiver archivedDataWithRootObject:marray1];  
    marray2 = [NSKeyedUnarchiver unarchiveObjectWithData:tempData];  

    userGroup归档后的文件内容如下:

    bplist00‘89T$topX$objectsX$versionY$archiver—TrootÄ≠	
    #$%+.3U$null‘
    TuserWteacherV$classYchildUserÄÄ	ÄÄ“
    TnameÄÄ“X$classesZ$classname¢TUserXNSObjectTUser”
     !"YchildNameÄÄÄUuser2ZChilduser2“&*£'()YChildUserTUserXNSObjectYChildUser“
    ,-ÄÄ
    “/2¢01WTeacherXNSObjectWTeacher“47¢56YUserGroupXNSObjectYUserGroup܆_NSKeyedArchiver(25:<JPY^fmwy{}Ñâãçíõ¶©Æ∑º√Õœ—”Ÿ‰È̘¸ (19>AKT^c:u
    键名用的明文,键值和对象的类的信息经过了处理,具体结构不详。


    NSKeyedArchiverDelegate, NSKeyedUnarchiverDelegate,归档和反归档代理,可以设置NSKeyedArchive和NSKeyedUnarchiver对象的delegate属性,当归档和反归档时可以根据数据情况增加一些特殊处理。


    展开全文
  • ios NSKeyedArchiver归档

    2019-04-13 17:25:19
    iOS 归档是数据持久化的一种,可以将一些数据保存到本地 存储单个数据 // 拼接本地路径 NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;...
    iOS 归档是数据持久化的一种,可以将一些数据保存到本地
    • 存储单个数据

        //	拼接本地路径
        NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
        NSString *filePath = [path stringByAppendingPathComponent:@"v.achiver"];
        
        //存储单个字符串到本地
        [NSKeyedArchiver archiveRootObject:@"打包文件" toFile:filePath];
        
        //从本地反归档
        NSString *result = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
        NSLog(@"result %@", result);
      
    • 存储多个数据

        //点坐标
        CGPoint p = CGPointMake(234, 1);
        //字符串
        NSString *str = @"字符串";
        
        //创建一个可变数据
        NSMutableData *muData = [[NSMutableData alloc] init];
        NSKeyedArchiver *archive = [[NSKeyedArchiver alloc] initForWritingWithMutableData:muData];
        //归档这些数据
        [archive  encodeCGPoint:p forKey:@"point"];
        [archive encodeObject:str forKey:@"str"];
        //归档完成
        [archive finishEncoding];
        
        //拼接路径
        NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
        NSString *filePath = [path stringByAppendingPathComponent:@"test2.achiver"];
        //写入本地
        [muData writeToFile:filePath atomically:YES];
        
        
        //取出数据
        NSMutableData *resultData = [[NSMutableData alloc] initWithContentsOfFile:filePath];
        NSKeyedUnarchiver *unArchive = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];
        //解档
        CGPoint resultP = [unArchive decodeCGPointForKey:@"point"];
        NSString *resultStr = [unArchive decodeObjectForKey:@"str"];
        [unArchive finishDecoding];
        
        NSLog(@"x %.2f, y %.2f, %@", resultP.x, resultP.y, resultStr);
      
    • 存储自定义档类到本地

        要存储自定义的类到本地需要在类里面实现这些方法
        <NSCopying, NSCoding> 遵守这两个协议
        - (void)encodeWithCoder:(NSCoder *)aCoder
        {
            [aCoder encodeObject:self.name forKey:@"name"];
            [aCoder encodeInteger:self.age forKey:@"age"];
        }
        
        
        - (instancetype)initWithCoder:(NSCoder *)aDecoder
        {
            if (self = [super init])
            {
                self.name = [aDecoder decodeObjectForKey:@"name"];
                self.age = [aDecoder decodeIntegerForKey:@"age"];
            }
            
            return self;
        }
        
        
        - (id)copyWithZone:(NSZone *)zone
        {
            
            TestModel *model = [[[self class] allocWithZone:zone] init];
            model.name = [self.name copyWithZone:zone];
            model.age = self.age;
            return model;
            
        }
      
        	
      
        //在外面使用
        //拼接路径
        NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
        NSString *filePath = [path stringByAppendingPathComponent:@"test3.achiver"];
        
        //创建类实例
        TestModel *model = [[TestModel alloc] init];
        model.name = @"你的名字";
        model.age = 11111;
        
        NSMutableData *mutableData = [[NSMutableData alloc] init];
        NSKeyedArchiver *archive = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mutableData];
        //将类归档到本地
        [archive encodeObject:model forKey:@"class"];
        [archive finishEncoding];
        [mutableData writeToFile:filePath atomically:YES];
        
        
        //解档
        NSData *resultData = [NSData dataWithContentsOfFile:filePath];
        NSKeyedUnarchiver *unArchive = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];
        //用类接受
        TestModel *resultModel = [unArchive decodeObjectForKey:@"class"];
        [unArchive finishDecoding];
        
        
        NSLog(@"%@, %ld", resultModel.name, resultModel.age);
      
    展开全文
  • NSKeyedArchiver归档(NSCoding)   归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存(实际上是一种文件保存的形式),特别是能够支持自定义类型对象。   一、实现 1、要使的需要存储的对象...
  • NSKeyedArchiver

    2018-04-24 16:43:52
    转自:...苹果提供了NSKeyedArchiver和NSKeyedUnarchiver两个类以供我们把对象序列化和反序列化,在存储之前使用NSKeyedArchiver进行序列化操作,并且写入本地文件,在使用...
  • 可以使用NSKeyedArchiver类创建带键(keyed)的文件来完成。在带键的文件中,每个归档的对象对应一个键,从文件中加载对象时,就是根据这个键来检索对象。 本文使用NSKeyedArchiver类和NSKeyedUnarchiver类对基本的...
  • 1.序列化有何作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中。 当你写的数据需要本地存储时,...
  • 数据持久化之NSKeyedArchiver

    万次阅读 2013-09-22 15:38:39
    基本的数据类型如NSString、NSDictionary、NSArray、NSData、NSNumber等可以用属性列表的方法持久化到.plist 文件中,但如果是一些自定义的类的话,属性列表的方法就不管用了。archiver 方法可以做到。...
  • I need to archive a NSMutableArray which is being controlled by an ArrayController....[NSKeyedArchiver archivedDataWithRootObject:array]; But I got this error: *** -[NSKeyedArchiver
  • 今天遇到一个反馈:在程序中用NSKeyedArchiver保存用户资料时,导致程序退出情况。源代码如下: if (sectionCount >= 5) { //保存数据到本地,防止每次进入都请求数据 NSString * filePath
  • +(BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path
  • NSKeyedArchiver本地存储失败?

    千次阅读 2019-05-23 11:04:37
    使用NSKeyedArchiver做本地存储,模拟器上成功,真机写入失败? NSString *homeDictionary = NSHomeDirectory(); _filePath = [homeDictionary stringByAppendingPathComponent:@"history.archiver"]; BOOL flag =...
  • NSKeyedArchiver在linux的实现默认的格式是二进制:NSArray *ary = @[@"hello",@"world",@"!!!",@11];[NSKeyedArchiver archiveRootObject:ary toFile:@"./foo.dat"];我们还可以选择XML格式:NSMutableData *data = ...
  • + (NSData *)archivedDataWithRootObject:(id)rootObject 返回值是NSData类型的。
  • 利用NSKeyedArchiver归档对象

    千次阅读 2013-03-16 22:19:41
    单个对象归档: NSArray *array = @[@"111", @"aaa", @333, @"asdf3111"]; NSString *homePath = NSHomeDirectory(); NSString *filePath = [homePath stringByAppendingPathComponent:@"test.t
  • OC对象序列化

    千次阅读 2014-02-20 16:16:17
    本文来自:感悟 OC可以程序用到的各种对象序列话到文件,在任何需要的情况下,从文件中重新读取数据重新构造对象,下面说...//=================NSKeyedArchiver========================  NSString *saveStr1 = @
  • 归档与恢复归档归档,英文Archiver[‘ɑrkɪvə],这里指的是将OC的对象存储为一个文件或者网络上的一个数据块。 恢复归档,英文UnArchiver,指的是将一个来自文件或网络的归档数据块恢复成内存中的一个OC对象。...
  • iOS数据存取和对象序列化

    千次阅读 2014-03-06 12:22:59
    使用NSKeyedArchiver类操作对象的存取  特点:该类可以将对象以键值对的形式存入文件,并通过key从文件中取出,与android中的SharedPreference用法类似  1. 将数据存入文件: NSString *rootDir = ...
  • 本文介绍Swift2.2 中, 创建文件/文件夹, 将NSObject对象存档到文件, 并从存档文件读取对象.1:可存档对象声明//必须要继承NSObject对象,并且实现NSCoding协议 class DataBean: NSObject, NSCoding { ...
1 2 3 4 5 ... 20
收藏数 6,729
精华内容 2,691
热门标签
关键字:

nskeyedarchiver