小工具      在线工具  汉语词典  css  js  c++  java

ios NSUserDefaults 读写自定义对象

IOS系统方法&&常用控件&&GitHub资源学习 额外说明

收录于:97天前


NSUserDefaults 提供对一些简要信息的访问。

例如,要将字符串存储和读取到 NSUserDefaults 中:

NSString *string = [NSString stringWithString @"hahaha"];  
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];  
[ud setObject:string forKey:@"myKey"];  
NSString *value;  
value = [ud objectForKey:"myKey"];

但并不是所有的东西都可以放进去。 NSUserDefaults 仅支持:NSString、NSNumber、NSDate、NSArray、NSDictionary。

如果将自定义类保存到 NSArray 中,然后再保存到 NSUserDefaults 中,则不会成功。如果您不相信我,请尝试一下,如果有效请告诉我。

那么我们应该做什么呢?

我发现的方法是让这个自定义类实现 <NSCoding> 协议(obj-c 协议中的 - (id) initWithCoder: (NSCoder *)coder 方法和 - (void)encodeWithCoder: (NSCoder *)coder 方法协议都是java接口,即C++的纯虚函数),然后将自定义的类对象编码成NSData,然后从NSUserDefaults中读取。

粘代码:

假设我们有一个像这样的简单类对象


@interface BusinessCard : NSObject <NSCoding>{  
    NSString *_firstName;  
    NSString *_lastName;  
}  
@property (nonatomic, retain) NSString *_firstName;  
@property (nonatomic, retain) NSString *_lastName;  
@end;  
  
@implementation BusinessCard  
@synthesize _firstName, _lastName;  
- (void)dealloc{  
    [_firstName release];  
    [_lastName release];  
    [super dealloc];  
}  
- (id) initWithCoder: (NSCoder *)coder  
{  
    if (self = [super init])  
    {  
        self._firstName = [coder decodeObjectForKey:@"_firstName"];  
        self._lastName = [coder decodeObjectForKey:@"_lastName"];  
    }  
    return self;  
}  
- (void) encodeWithCoder: (NSCoder *)coder  
{  
    [coder encodeObject:_firstName forKey:@"_firstName"];  
    [coder encodeObject:_lastName forKey:@"_lastName"];  
      
}  
  
@end  

然后访问时使用NSData作为载体:

BusinessCard *bc = [[BusinessCard alloc] init];  
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];  
NSData *udObject = [NSKeyedArchiver archivedDataWithRootObject:bc];  
[ud setObject:udObject forKey:@"myBusinessCard"];  
[bc release];  
udObject = nil;  
udObject = [ud objectForKey:@"myBusinessCard"];  
bc = [NSKeyedUnarchiver unarchiveObjectWithData:udObject] ;  
  


如果自定义类包含来自另一个自定义类的对象,则所有嵌套类都必须实现 <NSCoding>。



转载自:http://blog.csdn.net/chyroger/article/details/5785297


. . .

相关推荐

额外说明

记录http请求暂停、TCP ZeroWindow、连接未断开、setReadTimeout超时不抛异常等解析过程。

背景:本地有一台windows7系统的台式机,每天定时向服务器上传文件,后台是个http接口(为什么不用ftp呢,因为这个接口原来是一个html页面用form表单来实现的文件上传,改成ftp就需要改后台处理逻辑)。 问题:由于上传文件很大,最大有20MB

额外说明

【Unity3D日常开发】灯光系统,太阳光晕效果实现

推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一、前言 太阳光晕的效果虽然用处不大,但是很漂亮,漂亮不就行了,那么就来看看怎么在Unity3D中实现太阳光晕效果吧。 效果图:

额外说明

强化学习note1——马尔科夫奖励过程MRP和马尔科夫决策过程MDP各个函数的定义与区别

马尔科夫奖励过程MRP 状态转移函数: P ( S t + 1 = s ′ ∣ s t = s ) P\left(S_{t+1}=s^{\prime} \mid s_{t}=s\right) P(St+1​=s′∣st​=s) 奖励函数: R ( s t

额外说明

leetcode(1)485——最大连续 1 的个数(C++)

文章目录 前言 程序 疑惑 vector& nums int v : nums 前言 程序, 边刷边总结边学语言。 程序 class Solution { public: int findMaxConsecutiveOnes(vector<in

额外说明

数据结构的奇妙世界:实用算法与实际应用

文章目录 数据结构和算法的基本概念 数据结构 数组 链表 栈 队列 树 图 算法 常见的数据结构和算法 排序算法 快速排序示例 数据结构的应用 数据库管理系统 图像处理 网络路由 数据结构和算法的性能分析 时间复杂度 空间复杂度 如何更好地编写代码 避免

额外说明

《Spring MVC》 第十章 使用logback+Slf4j打印日志

系列文章目录 第一章 MVC模式 第二章 让程序run起来 第三章 @Controller、@RequestMapping 注解和获取请求参数 第四章 域对象、视图、转发和重定向 第五章 第五章 实现RESTful 第六章 MVC类型转换器、格式化器 第

额外说明

Spring Boot整合Redis快速入门实例

本篇演示环境 本篇基于Spring Boot 2.5.0 , 关于Redis的安装, 可以参考: Redis介绍、安装与初体验 和 Windows 下安装和使用Redis。 整合步骤 导入Redis 相关的依赖项 配置启动器 spring-boot-st

额外说明

Windows系统缺失了XInputUap.dll文件的解决办法

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个XInputUap.dll文

额外说明

vagrant如何实现共享项目目录,实现即时更新,并且解决访问缓慢问题

原文地址:https://www.toymoban.com/diary/apps/115.html Vagrant如何解决Linux服务器上共享目录即时更新的问题 最近 Vagrant+ Oracle VM VirtualBox 在本地环境配置 Linu

额外说明

trello 删除看板_如何在WordPress中添加类似于Trello的看板

trello 删除板 您想将类似 Trello 的看板添加到您的 WordPress 网站吗?如果您没有组织起来,那么跟踪团队的项目、监控销售进度以及与现有客户保持联系可能会很困难。在本文中,我们将分享如何通过在 WordPress 中创建类似 Trel

ads via 小工具