每一个应用都有一个 NSUserDefaults 实例,向 NSUserDefaults 类发送 standardUserDefaults 消息可以得到该实例。

NSUserDefaults 实例类似与 NSMutableDictionary,可以通过键存取或删除该对象。

当应用第一次使用 NSUserDefaults 实例时,NSUserDefaults 实例会自动从文件读取数据;修改数据后,NSUserDefaults 实例会自动将数据写入文件。

NSUserDefaults 的键必须是字符串类型,一个键对应一个偏好设置,偏好设置的值是对象,而且是可序列化的(serializable)对象;也可以通过基本类型的数值存取偏好设置。

NSUserDefaults 的键都是字符串,并且存放和读取某个偏好设置时需要使用同一个键。

可以将这些字符串定义为静态变量或者“宏”,这样就可以将这些变量用做键,而不时写死的字符串,从而避免输入错误。

偏好设置的命名命名约定: 应用名+偏好设置名+单词PrefKey

列子一:

// 存
NSString *const projectFavnamePrefkey = @"projectFavnamePrefkey";
NSInteger i =0;
[[NSUserDefaults standardUserDefaults] setInteger:i forkey:projectFavnamePrefkey];// 取
NSInteger j = [[NSUserDefaults standardUserDefaults] integerForKey:projectFavnamePrefkey];

要点:

NSUserDefaults非常好用,并不需要用户在程序中设置NSUserDefaults的全局变量,需要在哪里使NSUserDefaults的数据,那么就在哪里创建一个NSUserDefaults对象,然后进行读或者写操作。

针对同一个关键字对应的对象或者数据,可以对它进行重写,重写之后关键字就对应新的对象或者数据,旧的对象或者数据会被自动清理。

例子二:

NSArray* arr = [[NSArray alloc] initWithObjects:@"111", @"222",@"22223333",nil];
NSMutableArray* marr = [[NSMutableArray alloc] initWithArray:arr];
NSLog(@"%i",[arr count]);
NSLog(@"%i",[marr count]);NSUserDefaults *mydefault = [NSUserDefaults standardUserDefaults];
[mydefault setObject:arr forKey:@"test1"];
[mydefault setObject:marr forKey:@"test2"];
[mydefault synchronize];  //保存到disk

NSArray* getarr=[mydefault objectForKey:@"test1"];
NSLog(@"test1=%i",[getarr count]);
NSArray* getmarr=[mydefault objectForKey:@"test2"];
NSLog(@"test2=%i",[getmarr count]);

注意一点:只能存储基本对象,如果是自定义的对象,需要转换成 NSData 存储进去才可以

iOS 本地存储数据简单的说有三种方式:数据库、NSUserDefaults和文件

NSUserDefaults用于存储数据量小的数据,例如用户配置。并不是所有的东西都能往里放的,只支持:NSString, NSNumber, NSDate, NSArray, NSDictionary,详细方法可以查看类文件

NSUserDefaults读取和写入自定义对象(转)

NSUserDefaults可以存取一些短小的信息。

比如存入再读出一个字符串到NSUserDefaults:

但是并不是所有的东西都能往里放的。NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。

那怎么办呢?

方法是,让这个自定义类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到 NSData中,再从NSUserDefaults中进行读取。

粘代码:

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

.h

@interface BusinessCard : NSObject <NSCoding>{  NSString *_firstName;  NSString *_lastName;
}
@property (nonatomic, retain) NSString *_firstName;
@property (nonatomic, retain) NSString *_lastName;
@end;  

.m

@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  

调用:

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] ;   

转载于:https://www.cnblogs.com/dayw/p/3270471.html

iOS 数据持久化 NSUserDefault相关推荐

  1. 【iOS数据持久化】Plist使用

    iOS数据持久化Plist使用 iOS 端数据持久化就是把数据保存在本地,常用于基本信息储存,应用配置,应用支持数据源,网络请求缓存等.主要有如下几种方式: 方式 介绍 特点 Plist文件 属性列表 ...

  2. iOS 数据持久化方式 - 归档 反归档

    所谓归档:将复杂对象转化为NSData类型数据(复杂-->归档-->NSData--->WriteToFile) 注意:归档是将对象转化为数据字节,以文件的形式存储在磁盘上, 所谓反 ...

  3. 【iOS数据持久化】数据库(SQLite.swift)和FMDB

    数据持久化之SQLite数据库(SQLite.swift使用) 一.     简介 SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了.它的处理速 ...

  4. iOS - 数据持久化之 FMDB 的使用

    前言 上一篇文章「iOS - 使用 SQLite 数据库实现数据持久化」,介绍了如何使用 sqlite3 操作 SQLite 数据库实现增删改查.但是在代码编写的过程中,我们发现 sqlite3 需要 ...

  5. iOS数据持久化方案

    技术由来 数据持久化是iOS开发中必不可少的一项技能.因为开发中我们多会涉及到用户信息存储.文件存储.应用内容缓存中的一个或者几个场景. 数据持久化的几种方式 NSUserDefaults plist ...

  6. iOS 数据持久化 -- Core Data (2)

    2019独角兽企业重金招聘Python工程师标准>>> 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里, ...

  7. 【iOS数据持久化】偏好设置(UserDefaults)

    官网文档:NSUserDufaultClass Reference 关于偏好设置:AboutPreferences and Settings UserDefualts是一种便利的,通过key-valu ...

  8. 【iOS数据持久化】归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)

    简介 归档(Archive)也称为序列化(serialization),把对象转化为字节码,以文件的形式存储在磁盘上,只要遵循了NSCoding协议的对象都可以实现归档和解档(大部分foundatio ...

  9. iOS 数据持久化-- FMDB

    一.简介 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记9 直方图与匹配(五)模板匹配
  2. 福利 | 50张第四届UBDC全域大数据峰会赠票大放送!
  3. CISCO PIX/ASA Failover 技术初步学习
  4. 每日一皮:爸爸你听我解释...
  5. 面试:InnoDB 中一棵 B+ 树可以存放多少行数据?
  6. Matlab图像处理创新实践-实验2【图像滤波基础(2)】
  7. 机器人铁锈斑斑好吗_工业机器人系统运维员是什么职业?这个职业好吗?去哪里学?...
  8. C4C HTML mashup debug
  9. 告白——一个loser的手记
  10. 【剑指offer】面试题五:从尾到头打印链表
  11. 大数据分析如何助力企业发展
  12. 用windows系统访问ubuntu系统中的文件
  13. dspq值多少最好_蜂蜜纯度42的意思?蜂蜜纯度多少度好?
  14. 常见运维监控系统的技术选型
  15. 基于KNN的垃圾邮件分类实验
  16. Milk-Tea解析工具(DJ音乐解析)
  17. 基于Ubuntu 18.04打造嵌入式arm开发环境
  18. html在线人数统计代码,做一个简单的网站统计和在线人数统计
  19. 疯癫中的娱乐_ITfengbao
  20. 知识图谱入门一:知识图谱介绍

热门文章

  1. Android基础 淡入淡出、上下弹出动画的
  2. 理解 Delphi 的类(十) - 深入方法[13] - 在 interface 区声明的方法
  3. 一步步学习NHibernate(8)——HQL查询(2)
  4. python进阶(课程学习笔记)
  5. c++ 圆上任意点坐标计算_已知圆弧的一些信息,求得圆弧上中间点的坐标的方法(C++语言描述)...
  6. python读取json文件多个json数据_Python 加载包含多个JSON对象的JSON文件
  7. 15-自己写字符串库函数
  8. Python递归打印函数
  9. c++课设实验室管理系统_庆安知名实验室设备管理系统平均价格
  10. android 登录界面开源代码_【程序源代码】一个安卓查询类app制作的开源项目