NSUserDefaults轻量级永久存储数据使用介绍

/**
* NSUserDefaults 它是OC中一种单例对象,在一个工程里面(一个程序里面),它只有一个实例对象。无论你创建多少次,结果指针都会指向同一个地址,也就是只有一个实例对象,正因为如此,所以他能永久存储本地数据,简单实用。

 *  但是,它只能储存一些简单的轻量级的数据,比如本地数据的用户名和密码,收藏的网址,它是首选。
 * 当数据重复次数较多量很大的情况下,还是使用SQLite 存储,
 * 虽然NSUserDefaults 同样可以存储这么多数据,相比较而言会麻烦很多。

它支持的数据类型有:NSNumber(NSInteger、float、double,int),
NSString,NSData,NSArray,NSDictionary,BOOL.

 */

//NSUserDefaults 这么实用,那它是怎么保存数据的呢?我们该如何将以上类型的数据保存下来?

/———————-NSNumber———————/
//例如保存一个NSNumber的对象和怎样取出对象。
//存储方法
NSNumber *num = [NSNumber numberWithInteger:20];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];//实用便利构造器方法创建对象
[user setObject:num forKey:@”aNum”];//保存成功
//取出方法
NSUserDefaults *user11 = [NSUserDefaults standardUserDefaults];//虽然对象名字不同,但是指向同一个地址,数据是相同的,这就是单例的特性。
用user11 同样能取出 数据对象20。(下面同样使用user保存,使用user11取出数据,体现它的单例特性)
NSNumber *num11 = [user11 objectForKey:@”aNum”];//取出数据对象。
NSLog(@”>>>>>>>%@”,num11);//打印结果完全相同。

/**
 *  细心的可能发现了它使用的方法和字典很像,其实他有很多方法都跟字典很像,
 * 这样就有助于理解NSUserDefaults。
 */

/———————-NSString———————/

//例如保存一个NSString类型的对象
NSString *string = @"小明";
//因为NSUserDefaults是单例就直接使用上面的对象进行操作。
[user setObject:string forKey:@"aPerson"];
NSString *str = [user11 objectForKey:@"aPerson"];
NSLog(@"%@",str);
//打印结果也是相同

/———————-NSArray———————/

//例如保存一个NSArray
NSArray *array = [NSArray arrayWithObjects:@"123",@"小明",@"345", nil];
[user setObject:array forKey:@"数组"];
NSArray *arr = [user11 objectForKey:@"数组"];
NSLog(@"%@",arr);
//打印结果也是相同


//NSArray子类-可变数组NSMutableArray 类型的对象同样可以储存。如下:
NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"123",@"小明",@"345", nil];
[user setValue:array1 forKey:@"可变数组"];
//但是需要注意的是,它取出的数组只能是不可变的数组所以要用不可变数组接收。
即使你使用可变数组接收,运行时系统仍然返回的时不可变数组,
如果想要对数组数据进行删除添加等操作必须转换成可变数组。
NSArray *arr1 = [user11 objectForKey:@"数组"];
NSLog(@"%@",arr1);
//打印的结果也是相同

NSMutableArray *arr2 = [NSMutableArray arrayWithArray:arr1];
//这样转换后就可以对数组arr2进行添加删除操作了。
这时,你会想,要是想改变NSUserDefaults中保存的数据怎么办?
因为它和字典很像,key是唯一的,
可以使用同一个key再往NSUserDefaults里面存你已经改变过数据的数组,
NSUserDefaults就会因为key相同,进行一次覆盖操作,
结果就达到我们想要的结果。
[user setObject:arr2 forKey:@"数组"];

/———————-NSDictionary———————/
//使用上面的方法同样可以存储一个字典对象
NSDictionary *dict = [NSDictionary dictionaryWithObject:@”123” forKey:@”一个字符串”];
[user setObject:dict forKey:@”字符串字典”];
NSDictionary *dict1 = [user11 objectForKey:@”字符串字典”];
NSLog(@”%@”,dict1);
//打印结果也是相同

/————————NSData————————/
//因为NSUserDefaults 存储的数据类型有限,那么想要存储一个自定义对象该如何存储?
//方法一

//这个时候我们就可以使用归档方法来转换一个自定义Person类对象成NSData,
然后就可以用NSUserDefaults 进行保存了.
要使用NSDtata转换保存就要让Person接收协议并且实现协议的两个方法如下:
Person *p1 = [[Person alloc] init];
p1.name = @"小明";
p1.sex = @"boy";

Person *p2 = [[Person alloc] init];
p2.name = @"小红";
p2.sex = @"girl";
//将一个Person类对象转换成一个NSData类型对象,然后进行存储。
NSData *data1 = [NSKeyedArchiver archivedDataWithRootObject:p1];
[user setObject:data1 forKey:@"一个人小明"];//成功保存一个人信息。
//取出这个人信息的方法
NSData *personData = [user11 objectForKey:@"一个人小明"];
Person *person = [NSKeyedUnarchiver unarchiveObjectWithData:personData];
NSLog(@"name:%@ sex:%@",person.name,person.sex);
//打印这个取出人的信息就是小明信息。

这里写图片描述

//如何将一群人的信息保存下来呢?
//上面我们已经会使用归档将一个人转换成NSData类型数据,
一群的同样可以转换成一组NSDtata类型对象数据(转换使用for循环,
一个一个转换不现实),我们使用上面的俩人展示。
NSData *data2 = [NSKeyedArchiver archivedDataWithRootObject:p2];
NSArray *personArr = [NSArray arrayWithObjects:data1,data2, nil];
[user setObject:personArr forKey:@"两个人"];//这样两个人信息就被保存了。
//至于怎么取出,我想看了上面的,应该会了。
(转换成Person类型时同样使用归档取数据[NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)]).

//方法二

//既然NSUserDefaults 可以存储数组字典,
那么自定义Person类型对象可不可以把他们自身的属性当成字符串存储在数组或者字典中,
然后进行存储呢?答案是肯定的。(但是要注意,这里并不是把自定义对象保存在数组或字典中然后进行存储,
而是把自定义对象属性当成字符串进行的保存,
因为NSUserDefaults 不支持自定义对象的保存)
//首先用自定义Person类创建对象。
Person *p3 = [[Person alloc] init];
p3.name = @"张三";
p3.sex = @"man";

//把一个人看成一个数组,
NSArray *aPerson = [NSArray arrayWithObjects:p3.name,p3.sex, nil];//和上面的数组存储相同。
[user setObject:aPerson forKey:@"aPerson"];
//这样就可以把自定义对象转换后进行保存,其实质还是保存的数组中的NSString类型的数据。和归档是不同的



/**
 *  既然能存储数据,当然能删除数据。上面有说过他很像字典,所以删除的方法也很简单。
 */
//使用key来删除数据。
[user removeObjectForKey:(NSString *)];

//以上就是个人对NSUserDefaults 个人见解,楼主初学,如有不足之处还请谅解并指出,总之,NSUserDefaults 在我们编写代码中是最常用的一个永久保存数据的方法,也是最简单的,它还有很多中使用方法,楼主学的也不深,有兴趣的可以可以自己试试NSUserDefaults其他的方法。(例如使用[user dictionaryRepresentation];返回的是一个字典,同样有返回数组的方法。)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
2019年最新版本网址铺吧网址导航源码程序按来路自动排行源码程序下载。简介:【系统开发环境】 演示地址www.wzp8.com 1. 系统环境:MS WINDOWS 2003 +IIS 6.0 2. 数 据 库:MS Access2003 3. 测试浏览器:腾讯TT浏览器 微软IE浏览器6.0 微软IE浏览器7.0 4. 系统分辨率:1024X768 -------------------------------------------------------------------------- ☆系统前台简介☆ 1.申请加入免费友情链接网的网站按最后点进的时间排序首页和分类显示链接, 分类以昨日点入时间为准,每晚十二点后生成静态。 2.每来访一个IP,就会自动排到第一(无延时),自动收录功能开通的站要刷新一下才能显 示,当天来路不同,显示颜色也不同 3.首页白天3分钟,晚上5分钟自动更新一次,全站24小时手动更新一次。 4.站内搜索功能。 5.网址库中分离出的【名站导航】【实用工具】【友情链接】 ☆系统后台功能☆ 设置网站的基本信息。广告位设置。***(开通关闭新站提交,开通关闭自动审核)***。非法词拦截,非法网址拦截。 管理员帐号/密码更改。 网站文字广告管理 修改,添加! 客户留言管理,回复,修改,删除留言。 黑客入侵查看,删除黑客入侵数据! 添加删除分类。 分类可修改可设置首页是否显示。 酷站可设置首页是否显示。 添加删除修改网址内容,是否推荐,是否审核。 可从网址库中分离出【名站导航】【实用工具】【友情链接】 【名站导航】【实用工具】可由快速通道添加和管理。 【友情链接】从网址列表中设置。 常用维护共三项,删除所有未审核的网站,开通所有有点入的网站,删除所有重复提交的网站 站内搜索功能。 生成htm分类页面,生成htm主页及其它页面。 可修改主页,分类及其它页面模板。 具有数据库【备份】【压缩】【恢复】功能。 具有在线广告管理功能。(10个广告位),非常方便! 新增站长添加的网址和用户添加的网址分开独立管理 防注入 。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值