前言:

作为从事Android开发人来说一定听说过SharedPreferences,然后要成为一名ios开发工程师来说咋能不知道NSUserDefaults!接下来让我们认识一下。

NSUserDefaults简介:

NSUserDefaults是一种存储轻量级的本地数据方式,NSUserDefaults是一个单例,主要用于数据的永久保存,简单实用。试用场景:比如我们保存一下用户的登录信息,一个标识等。支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL等系统定义的数据类型。上面标记红色是为了引起大家的注意,自己在写测试程序的时候写了一个NSMutableArray 然后保存,不幸的是直接挂掉,后来查了一下资料,原来NSUserDefaults 存储的对象全是不可变的!

废话不多说写个测试程序看看:

首先存储一个字符串NSString

   //NSUserDefaults 使用
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
NSString *nameForSave =@"whoislcj";
NSString *key=@"name";
//保存数据
[defaults setObject:nameForSave forKey:key];//根据键值对保存name
//读取数据
NSString *nameForGet = [defaults objectForKey:key];//根据键值取出name
NSLog(@"nameForGet---%@",nameForGet);
NSLog(@"nameForSave==nameForGet---%i",[nameForGet isEqualToString:nameForSave]);

然后存储一个NSArray

    NSArray *myArray = [NSArray arrayWithObjects:@"who", @"islcj", nil];
[defaults setObject:myArray forKey:@"testArray"];
NSArray *myArray1 = [defaults arrayForKey:@"testArray"];
NSLog(@"myArray---%@",myArray1);

是不是很简单,其他的基础类型就不一一实现了。这个就在想既然是setObject那到底支持不支持自定义对象类型呢,所以写了个自定义对象

    Person *person1=[[Person alloc]init];
person1.name=@"whoislcj";
[defaults setObject:person1 forKey:@"person1"];
Person *person2=[defaults objectForKey:@"person1"];
NSLog(@"person2---%@",person2.name);

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCoding>

@property (nonatomic,strong)NSString *name;

@end

Person.m

#import "Person.h"

@implementation Person

#pragma mark - NSCoding Delegate

-(id)init{
if(self==nil){
self =[super init];
}
return self;
} - (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.name forKey:@"name"];
} - (id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self)
{
self.name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
} @end

运行结果:不幸的事情发生了 ,直接挂掉了,后来查了一下资料NSUserDefaults 本身不支持自定义对象的存储!那怎么办呢,方法就有很多种了,

第一种自定义对象转化成Json字符串存储,第二种自定义对象转化成NSData数据。

用过SharedPreferences都知道commit和apply函数,所有想想ios这边会不会也有这样的考虑,所以查阅一番原来也是一样的,仅仅调用[defaults

setObject: forKey:]之后NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘,具体代码如下:

//这里建议同步存储到磁盘中,但是不是必须的
[defaults synchronize];

接下来又想起来之前用SharedPreferences的数据清除了,那么NSUserDefaults怎么清楚数据的呢?

[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];

[[NSUserDefaults standardUserDefaults] synchronize];

值得注意是:

用过SharedPreferences的都知道它的保存方式是一个xml文件而且是明文的,其实NSUserDefaults在iOS沙盒中也是一个.plist文件而且也是没有加密的,所以对安全性要求的数据最好经过加密之后再存储。

IOS数据存储之NSUserDefaults的更多相关文章

  1. IOS数据存储之Sqlite数据库

    前言: 之前学习了数据存储的NSUserDefaults,归档和解档,沙盒文件存储,但是对于数据量比较大,需要频繁查询,删除,更新等操作的时候无论从效率上还是性能上,上述三种明显不能满足我们的日常开发 ...

  2. IOS数据存储之文件沙盒存储

    前言: 之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了.文件沙盒存储主要存储非机密数据,大的数据. ...

  3. iOS数据存储之属性列表理解

    iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起 ...

  4. iOS数据存储之对象归档

    iOS数据存储之对象归档 对象归档 对象归档是iOS中数据持久化的一种方式. 归档是指另一种形式的序列化,但它是任何对象都可以实现的更常规的类型.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文 ...

  5. iOS数据存储类型 及 堆(heap)和栈(stack)

    iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 --  由编译器自动分配释放. 2堆 --  一般由程序员分配释放,若程序员不释放,程序结束时可能由O ...

  6. IOS(swift)-数据存储 · 用NSUserDefaults存储配置信息

    1.用NSUserDefaults存储配置信息 注:本次使用NSUserDefaults存储信息是在不考虑安全问题的前提下.分两种情况:1.如果是密码用户名等敏感信息,请使用Keychain存储用户敏 ...

  7. ios数据永久存储之----NSUserDefaults

    我们在开发app时不可避免的会在本地存储一些数据,NSUserDefaults就是系统提供的一个用来数据存储的类,本片文章就来介绍一些NSserdefazults的用法. 详细内容:https://m ...

  8. iOS数据存储

    [reference]http://www.infoq.com/cn/articles/data-storage-in-ios 谈到数据储存,首先要明确区分两个概念,数据结构和储存方式.所谓数据结构就 ...

  9. 最全的iOS数据存储方法

    目的 项目准备运用的Core Data进行本地数据存储,本来打算只写一下Core Data的,不过既然说到了数据存储,干脆来个数据存储基础大总结!本文将对以下几个模块进行叙述. 沙盒 Plist Pr ...

随机推荐

  1. 使用QQ邮箱发送email(Python)

    实际开发过程中使用到邮箱的概率很高,那么如何借助python使用qq邮箱发送邮件呢? 代码很简单,短短几行代码就可以实现这个功能. 使用到的模块有smtplib和email这个两个模块,关于这两个模块 ...

  2. BestCoder Round 69 Div 2 1001&& 1002 || HDU 5610 && 5611

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5610 如果杠铃总质量是奇数直接impossible 接着就考验耐心和仔细周全的考虑了.在WA了三次后终于发 ...

  3. uboot

    ******************************************day:2014/10/14**************************uboot************* ...

  4. 深入理解javascript系列(4):立即调用的函数表达式

    本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...

  5. JAligner的一个坑

    JAligner是一个集成多个罚分矩阵的蛋白质序列比对工具包,提供充足的API供开发人员调用. 但是,不可否认的是,它的结构写得不够规范.以前我是将它放在普通的Java项目里使用,没有问题.但是,今天 ...

  6. 【转】你所不知道的Android Studio调试技巧

    这篇写Android studio debug技巧个人觉得写得不错,转自:http://www.jianshu.com/p/011eb88f4e0d# Android Studio目前已经成为开发An ...

  7. pythonchallenge 解谜 Level 8

    #-*- coding:utf-8 -*- #代码版本均为python 3.5.1 #Level 7 import bz2 un=b'BZh91AY&SYA\xaf\x82\r\x00\x00 ...

  8. Javascript初学篇章_8(事件)

    事件 HTML 事件是发生在 HTML 元素上的事情.例如用户点击按钮时,点击也是一个事件.事件可以用于处理表单验证,用户输入,用户行为及浏览器动作,如: 页面加载时触发事件 页面关闭时触发事件 用户 ...

  9. Asp,Net里的Form表单

    1.Form表单是页面与Web服务器交互过程中最重要的信息来源. 2.<form action="传到哪个页面的网站地址" method="post和get 两种方 ...

  10. [转]html5表单上传控件Files API

    表单上传控件:<input type="file" />(IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件:< ...