iOS学习笔记--04 NSUserDefaults
来源:互联网 发布:java中tcp和udp的区别 编辑:程序博客网 时间:2024/06/06 09:02
NSUserDefaults适合存储轻量级的本地数据。
如用户信息,下次登录时候,就可以直接读取本地信息显示到页面,不用再次输入。
如果是自定义对象,则不可以直接存储。
一、NSUserDefaults以及存储类型
NSUserDefaults是一个单例,在整个程序中只有一个实例对象。
NSUserDefaults作为iOS数据存储方式的一种,是操作起来较为简单的方式。但是也有其局限性,就是存储类型有限,
支持以下数据类型:
NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.
如果需要将以上的数据类型永久保存到NSUserDefaults中,只需要一个简单的操作。如存储一个NSString的数值:
NSString *name = @"wxx";NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];[ud setObject:name forKey:@"name"];
将数据取出也特别简单:
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];NSString *name = [ud objectForKey:@"name"];
PS:每次使用相同的key存储,都会覆盖原有的数据。
二、存储可变数据
NSUserDefaults存储对象是不可变的。想要存入可变,需要先转为不可变对象。即如果想要存储一个NSMutabelArray对象,
需要创建一个NSArray,将NSMutabelArray赋给,最后将NSArray存入NSUserDefaults中去。如下:
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"one",@"two",@"three", nil];NSArray *array = [NSArray arrayWithArray:mArray];NSUserDefaults*ud = [NSUserDefaults standardUserDefaults];[ud setObject:array forKey:@"存储不可变"];接收数据也一样,如果需要将数据接收给可变数据,需要先用不可变数组获取,再赋给可变数据。
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];NSMutableArray *mArr;NSArray *arr = [ud objectForKey:@"存储不可变的数据类型"];mArr = [NSMutableArray arrayWithArray:arr];[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL *stop) { NSLog(@"%@",obj);}];
三、存储自定义对象
前面提到,NSUserDefaults存储的几种数据类型,不包括自定义对象。所以,如果想要存储自定义对象,
需要将自定义对象转化为NSData,即可存储。暂时没去理解归档的做法,这里先略过。
下面直接给出例子。
自定义User对象,包括name,age两个属性:
#import <Foundation/Foundation.h>//遵循NSCoding协议,需要在.m文件中实现两个方法:// encodeWithCoder和initWithCoder@interface User : NSObject<NSCoding>@property(nonatomic,strong)NSString *name;@property(nonatomic,assign)NSInteger age;@end
#import "User.h"@implementation User-(void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:[NSNumber numberWithInteger:self.age] forKey:@"age"]; [aCoder encodeObject:self.name forKey:@"name"];}-(id)initWithCoder:(NSCoder *)aDecoder{ if (self = [super init]) { self.age = [[aDecoder decodeObjectForKey:@"age"]integerValue]; self.name = [aDecoder decodeObjectForKey:@"name"]; } return self;}@end
通过两个按钮的点击事件,模拟存储数据和获取数据:
#import <UIKit/UIKit.h>@interface ViewController : UIViewController@end
#import "ViewController.h"#import "User.h"@interface ViewController (){ NSUserDefaults *ud;}@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad];}- (IBAction)save:(UIButton *)sender { // 将自定义类型存入NSUserDefaults User *user = [[User alloc]init]; user.name = @"wxx"; user.age = 23; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user]; ud = [NSUserDefaults standardUserDefaults]; [ud setObject:data forKey:@"user1"]; }- (IBAction)get:(UIButton *)sender { // 获取自定义类型的数据 ud = [NSUserDefaults standardUserDefaults]; NSData *data = [ud objectForKey:@"user1"]; User *user = [NSKeyedUnarchiver unarchiveObjectWithData:data]; NSLog(@"name = %@,age = %ld",user.name,(long)user.age); //打印结果:2015-11-24 17:21:23.442 MyNSUserDefaultsDemo[16276:2562711] name = wxx,age = 23}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end
参考:http://my.oschina.net/u/1245365/blog/294449
0 0
- iOS学习笔记--04 NSUserDefaults
- iOS 学习笔记 8 NSUserDefaults学习
- iOS 学习笔记 8 NSUserDefaults学习
- IOS学习笔记14—用户首选项NSUserDefaults
- IOS学习笔记14—用户首选项NSUserDefaults
- iOS学习笔记——使用NSUserDefaults存储自定义数据
- ios学习--NSUserDefaults 简介&使用 NSUserDefaults 存储自定义对象
- IOS 学习笔记17 iPhone开发之使用NSUserDefaults存储数据
- IOS学习之NSUserDefaults的一些用法
- iOS学习之—— NSUserDefaults
- iOS:NSUserDefaults
- iOS:NSUserDefaults
- iOS NSUserDefaults
- ios-NSUserDefaults
- iOS-NSUserDefaults
- iOS NSUserDefaults
- iOS NSUserDefaults
- iOS NSUserdefaults
- Android控件之AutoCompleteTextView
- 差分gps系统搭建
- iOS 多线程编程之GCD
- Maven中国镜像
- 布局中使用权重对齐问题
- iOS学习笔记--04 NSUserDefaults
- iOS开发笔记-判断输入的是否是汉字
- ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别
- 微信去除 防欺诈或盗号请不要输入qq密码 的方法
- oracle启动和关闭数据库
- 项目名称上有红叉
- Android之ContentObserver详解
- 调用微信接口的curl_post_page / curl_get_page 方法
- 当spring 容器初始化完成后执行某个方法