NSUserDefaults写入和读取自定义的对象

需要写入的对象必须实现NSCoding protocol

Person Class

Person.h

#import <Foundation/Foundation.h>

#import "Face.h"

@interface Person : NSObject <NSCoding>

@property (nonatomic, strong) NSString      *personId;
@property (nonatomic, strong) NSString      *name;
@property (nonatomic, assign) NSInteger      age;
@property (nonatomic, strong) NSArray       *photos;
@property (nonatomic, strong) NSDictionary  *phoneNumber;

@property (nonatomic, strong) Face          *face;

@end

Person.m

#import "Person.h"

@implementation Person
@synthesize personId    = _personId;
@synthesize name        = _name;
@synthesize age         = _age;
@synthesize photos      = _photos;
@synthesize phoneNumber = _phoneNumber;
@synthesize face        = _face;

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if(self = [super init])
    {
        self.personId       = [aDecoder decodeObjectForKey:@"id"];
        self.name           = [aDecoder decodeObjectForKey:@"name"];
        self.age            = [[aDecoder decodeObjectForKey:@"age"] integerValue];
        self.photos         = [aDecoder decodeObjectForKey:@"photos"];
        self.phoneNumber    = [aDecoder decodeObjectForKey:@"phoneNumber"];
        self.face           = [aDecoder decodeObjectForKey:@"face"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.personId forKey:@"id"];
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:[NSNumber numberWithInteger:self.age] forKey:@"age"];
    [aCoder encodeObject:self.photos forKey:@"photos"];
    [aCoder encodeObject:self.phoneNumber forKey:@"phoneNumber"];
    [aCoder encodeObject:self.face forKey:@"face"];
}

Face Class

Face.h

#import <Foundation/Foundation.h>

@interface Face : NSObject <NSCoding>

@property (nonatomic, strong) NSString *head;
//@property (nonatomic, strong) NSString *eyes;
//@property (nonatomic, strong) NSString *nose;
//@property (nonatomic, strong) NSString *mouth;
//@property (nonatomic, strong) NSString *ears;

@end

Face.m

#import "Face.h"

@implementation Face

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if(self = [super init])
    {
        self.head   = [aDecoder decodeObjectForKey:@"head"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.head forKey:@"head"];
}

@end
写入和读取操作

    Person *person = [[Person alloc] init];
    person.personId = @"123456789";
    person.name = @"Hunk";
    person.age = 10;
    person.photos = @[@"a.png", @"b.png", @"c.png"];
    person.phoneNumber = @{@"mobile_phone" : @"987654321", @"work" : @"01012345678"};
    Face *face = [[Face alloc] init];
    face.head  = @"Round shape";
    person.face = face;

    NSData *personData0 = [NSKeyedArchiver archivedDataWithRootObject:person];

    [[NSUserDefaults standardUserDefaults] setObject:personData0 forKey:@"person"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    NSData *personData1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"person"];
    Person *person1 = [NSKeyedUnarchiver unarchiveObjectWithData:personData1];

NSUserDefaults写入和读取自定义的对象,布布扣,bubuko.com

时间: 2024-10-08 09:47:46

NSUserDefaults写入和读取自定义的对象的相关文章

[MISS静IOS开发原创文摘]-AppDelegate存储全局变量和 NSUserDefaults standardUserDefaults 通过模型保存和读取数据,存储自定义的对象

由于app开发的需求,需要从api接口获得json格式数据并保存临时的 app的主题颜色 和 相关url 方案有很多种: 1, 通过AppDelegate保存为全局变量,再获取 2,使用NSUSerDefault 第一种 :通过AppDelegate方法: 定义全局变量 // // AppDelegate.h // // Created by MISSAJJ on 15/5/5. // Copyright (c) 2015年 MISSAJJ. All rights reserved. // #i

在NSUserDefaults中保存自定义的对象

在iOS开发中,需要用到一些回调值(从A到B,从B返回时把B中的值带回A中),其实方法也很多(delegate,block,nsuserdefaults等).我想用NSUserDefaults回调一个我自定义的对象.于是我就直接去setobject这个对象,这是程序就出现crash,crash信息为 reason: 'Attempt to insert non-property list object <ContacterInfo: 0x7feb76325ed0> for key curren

NSUserdefaults 简介以及存储自定义数据类型的方法

一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单数据的一个主要原因. 使用 NSUserDefaults 存储自定义对象的最初,我们必须认识NSUserDefaults可以存储哪一些类型的数据,下面一一列出: NSUserDefaults支持的数据类型有:NSNumber(NSInteger.float.doubl

QT: QByteArray储存二进制数据(包括结构体,自定义QT对象)

因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类 1. 利用memcpy拷贝内存数据 //自定义person结构体 Cpp代码   typedef struct { int age; char name[20]; }Person; //向QByteArray写入多个结构体 void writeStruct() { QByteArray ba; ba.resize(2*sizeof(Pers

使用MD5完成自定义Person对象的加密过程

---恢复内容开始--- 首先:我们对自定义Person对象的加密过程所用的方法是归档写入文件的方法. 第一步:创建Person,继承于NSObject,然后在Person.h文件遵守NSCoding协议,声明相关属性,如下图: 第二步:实现NSCoding方法 第三步:回到ViewControll.m文件,引入Person.h文件.另外引入系统的CommonCrypto文件的.h文件,如下图.然后找到沙盒路径,创建Person对象. 第四步:从第四部开始进行归档操作,如下图. 第五步:开始加密

java处理Excel文件---excel文件的创建,删除,写入,读取

这篇文章的代码是我封装的excel处理类,包含推断excel是否存在,表格索引是否存在,创建excel文件,删除excel文件,往excel中写入信息,从excel中读取数据. 尤其在写入与读取两个方法中,我採用了java反射机制去实现,以object对象作为參数就可以.代码自己主动解析该实体类的属性与方法.代码重用性高. 代码另一些须要改进和扩展的地方.大家能够依据实际情况进行简单改动. 上代码,首先是我封装的这个类(採用的是POI包): package module.system.commo

Win10系列:JavaScript写入和读取文件

正如上面的内容中所提到的,文件保存选取器用于保存文件,通过Windows.Storage.Pickers命名空间中的FileSavePicker类的pickSaveFileAsync函数可以向指定的文件系统位置中保存一个文件.文件保存之后,还可以对其进行读写操作,如果是向文件中写入内容,可以使用Windows.Storage.FileIO类中的writeTextAsync(file, contents)函数或appendTextAsync(file,contents)函数来实现,参数file表示

IOS调用WCF提供的服务方法,但是方法的参数是WCF那边自定义的对象,这样有办法调用么,如果可以IOS应该怎么传参呢?请问有了解的么,

最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想到其中碰到不少问题,在网上搜索很久一直没有想到的解决方案,最后实现对数据流的分段写入然后后端再来解析流实现的此功能:后端运用WCF中的REST来接收数据:REST还是比较简单的知识,若是不懂可以简单网上了解一下:下面我们先了解一些本次运用到的理论知识: 一:理论知识 由于低层协议特性限制,WCF的流模式只支持如下四种:1:BasicHttpBi

【PHP】文件写入和读取详解

文章提纲: 一.实现文件读取和写入的基本思路 二.使用fopen方法打开文件 三.文件读取和文件写入操作 四.使用fclose方法关闭文件 五.文件指针的移动 六.Windows和UNIX下的回车和换行 一.实现文件读取和写入的基本思路: 1.通过fopen方法打开文件:$fp =fopen(/*参数,参数*/),fp为Resource类型 2.进行文件读取或者文件写入操作(这里使用的函数以1中返回的$fp作为参数) 3.   调用fclose($fp)关闭关闭文件 二:使用fopen方法打开文