• 关于iOS如何利用归档,存储数据。


    本地常用的存储数据方法有以下几种

    1.存入plist文件中(缺点,只能存一些基本数据类型)

    2.利用userdefaults(存点基本设置,其实也是一个plist文件,其实跟plist一样)

    3.归档(由于前两个都只能存一些基本类型,所以归档就闲的很厉害,因为可以存一些自定义类型)

    先定义一个类:并定义属性,以及写入存和取的代理方法。代码如下:

    Person.h

    #import <Foundation/Foundation.h>

    @interface Person : NSObject
    @property(nonatomic,copy)NSString * name ;
    @property(nonatomic,assign)NSInteger age;
    @property(nonatomic,assign)double height;

    @end

    Person.m

    #import "Person.h"

    @implementation Person

    //当你讲一个自定义对象保存到文件的时候就需要调用该方法
    //在该方法中说明如何存储自定义对象的属性
    //也就说明在该方法中说清楚存储自定义对象的哪些属性

    - (void)encodeWithCoder:(NSCoder * )aCoder
    {
        NSLog(@"调用了encodeWithCoder:方法");
        [aCoder encodeObject:self.name forKey:@"name"];
        [aCoder encodeInteger:self.age forKey:@"age"];
        [aCoder encodeDouble:self.height forKey:@"height"];
        
    }

    //当从文件中读取一个对象的时候就会调用该方法
    //在该方法中说明如何读取保存文件中的对象
    //也就是说在该方法中说清楚怎么读取文件中的对象

    - (id)initWithCoder:(NSCoder* )aDecoder
    {
        NSLog(@"调用了initWithCoder:方法");
        
    //    注意:在构造方法中需要先初始化父类的方法
        if (self = [super init]) {
            self.name = [aDecoder decodeObjectForKey:@"name"];
            self.age = [aDecoder decodeIntegerForKey:@"age"];
            self.height = [aDecoder decodeDoubleForKey:@"height"];
    }
        return self;
    }


    @end

    ViewController.m

    - (IBAction)saveBtnOnclick:(id)sender {
        
    //    1.创建对象
        Person * p = [[Person alloc]init];
        p.name =@"文顶顶";
        p.age = 23;
        p.height = 1.7;
        
        
    //    2.获取文件文件路径
        NSString * docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        
        NSString * path = [docPath stringByAppendingPathComponent:@"person.yangyang"];
        NSLog(@"path = %@",path);
    //    3.将自定义的对象保存到文件中
        [NSKeyedArchiver archiveRootObject:p toFile:path];
        
        
        
    }

    - (IBAction)readBtnOnclick:(id)sender {
    //    1.获取文件路径
        NSString * docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        NSString * path = [docPath stringByAppendingPathComponent:@"person.yangyang"];
        
        NSLog(@"path = %@",path);
    //
    ////    2.文件中读取对象
        Person * p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
        NSLog(@"%@,%ld,%1f",p.name,(long)p.age,p.height);


    }
    @end

    -----------------------------------学习自文顶顶博客   http://www.cnblogs.com/wendingding/p/3775293.html

  • 相关阅读:
    【http】使用浏览器Cache和http状态码304实现的客户端缓存
    delegate与模式
    用Delegate绕开频繁反射的又一个简单高效的方法
    直接调用、委托与反射调用的性能区别
    Lambda表达式的非Linq用法
    泛型+反射+特性=以静制动
    绕开频繁反射
    不要用错单例模式
    活用接口——反例:MultiKeyDictionary
    jQuery框架总体分析
  • 原文地址:https://www.cnblogs.com/YaoWang/p/4685355.html
Copyright © 2020-2023  润新知