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

ios NSUserDefaults 读写自定义对象

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

收录于:43天前


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


. . .

相关推荐

额外说明

pip安装镜像源

https://pypi.douban.com/simple/ pip install PyQt6 -i https://pypi.douban.com/simple/

额外说明

fmt标签库

原文参考:http://blog.csdn.net/xiaoping8411/article/details/4238340   JSTL标签提供了对国际化(I18N)的支持,它可以根据发出请求的客户端地域的不同来显示不同的语言。同时还提供了格式化数据和

额外说明

大模型时代矢量数据库的创新与变革

前言: 在当今信息时代,数据库扮演着关键的角色,用于存储和管理各种类型的数据。向量数据库是一种专门设计用于高维数据存储和快速检索的数据库系统。在不断创新和变革后,腾讯云不久前发布了AI原生(AI Native)向量数据库。 文章目录 向量数据库发展背景和

额外说明

Linux基础 第二节 第四课

[toc] 连接 类似 WIn7 快捷方式     软链接 soft link     硬链接 hard link 区别:     再删除链接时, 是否删除源文件 案例: 创建一个软链接 $ ln -s file / dir linkName eg:  

额外说明

# Spring Cloud的新潮流:服务网格与无缝通信

文章目录 微服务通信的挑战 引入服务网格 Spring Cloud和服务网格的融合 Envoy与Spring Cloud的集成 服务网格的可观察性 服务网格的安全性 无缝的微服务通信 结语 -欢迎来到架构设计专栏~# Spring Cloud的新潮流:服

额外说明

SpringMVC 源码解析 - Controller 的扫描注册及匹配过程

一、SpringMVC Handler 扫描注册过程 在本专栏前面文章中对 SpringMVC 请求执行过程进行了分析,文章地址如下: SpringMVC 源码解析 - 请求执行的过程 其中有个重要的组件 HandlerMapping 在源码中起到了非常

额外说明

【PHP面试题13】PHP底层如何用一个zval结构实现多种变量类型的

文章目录 一、概览 二、什么是zval结构? 三、zval的类型 四、如何创建zval结构? 4.1 直接使用C代码创建 4.2 使用PHP提供的函数创建 五、如何操作zval结构? 5.1 Z_TYPE 5.2 Z_LVAL 5.3 Z_STRVAL

额外说明

2010年75个最有用的jQuery插件

http://home.open-open.com/space-668-do-blog-id-3127.html

额外说明

Linux【脚本 06】HTTPS转发HTTP安装OpenSSL、Nginx(with-http_ssl_module)及自签名的X.509数字证书生成(一键部署生成脚本分享)

HTTPS转发HTTP流程 1.流程说明 2.安装OpenSSL 3.Nginx安装http_ssl模块 4.自签名证数生成 4.1 分步骤生成 4.2 自动化生成 5.Nginx配置 6.总结 1.流程说明 Nginx要开启ssl功能,Windows版

ads via 小工具