一. 偏好存储使用场景
- 用户存储偏好设置
- 缓存信息
- 轻量级数据存储
- 不可用于存储大量数据
- 不要滥用synchronize方法
- 警惕数据被清空,因为NSUserDefaults是单例类,代码的任何地方都可以将它删除
二. 偏好存储工作原理

三. 偏好存储支持的数据类型
不可存储可变类型

不可存储可变类
四. 偏好存储的增加、读取、修改、删除
//
// ViewController.m
// UserDefaultDemo
#import "ViewController.h"
@interface ViewController ()
- (IBAction)addPreference:(id)sender;
- (IBAction)readPreference:(id)sender;
- (IBAction)modifyPreference:(id)sender;
- (IBAction)deletePreference:(id)sender;
- (IBAction)clearAllPreference:(id)sender;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)addPreference:(id)sender {
//增加偏好设置
//获取NSUserDefault类实例
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//存储数字类型
[userDefaults setBool:NO forKey:@"BoolKey"];
[userDefaults setInteger:123 forKey:@"IntegerKey"];
[userDefaults setFloat:0.123 forKey:@"FloatKey"];
[userDefaults setDouble:0.123456 forKey:@"DoubleKey"];
//存储字符串类型
[userDefaults setObject:@"Hello" forKey:@"StringKey"];
//存储NSData类型
NSData *data = [@"hello Data" dataUsingEncoding:NSUTF8StringEncoding];
[userDefaults setObject:data forKey:@"DataKey"];
//存储数组类型
NSArray *array = @[@"one",@"two",@"three"];
[userDefaults setObject:array forKey:@"ArrayKey"];
//存储字典类型
NSDictionary *dict = @{@"key1":@"value1",@"key2":@"value2",@"key3":@"value3"};
[userDefaults setObject:dict forKey:@"DictionaryKey"];
[userDefaults synchronize];//将存储的偏好存储内容同步到ROM中
}
- (IBAction)readPreference:(id)sender {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//读取数字值
BOOL readBool = [userDefaults boolForKey:@"BoolKey"];
NSLog(@"Bool value is:%@",readBool?@"YES":@"NO");
NSInteger readInteger = [userDefaults integerForKey:@"IntegerKey"];
NSLog(@"Integer value is:%ld",readInteger);
float readFloat = [userDefaults floatForKey:@"FloatKey"];
NSLog(@"Float value is:%f",readFloat);
double readDouble = [userDefaults doubleForKey:@"DoubleKey"];
NSLog(@"Double value is:%lf",readDouble);
//读取字符串值
NSString* readString = [userDefaults objectForKey:@"StringKey"];
NSLog(@"String value is:%@",readString);
//读取NSData值
NSData* readData = [userDefaults objectForKey:@"NSDataKey"];
NSString* dataToString = [[NSString alloc]initWithData:readData encoding:NSUTF8StringEncoding];
NSLog(@"NSData value is:%@",dataToString);
//读取数组值
NSArray* readArray = [userDefaults objectForKey:@"ArrayKey"];
NSLog(@"Array value is:%@",readArray);
//读取字典值
NSDictionary* readDictionary = [userDefaults objectForKey:@"DictionaryKey"];
NSLog(@"Dictionary value is:%@",readDictionary);
}
- (IBAction)modifyPreference:(id)sender {
//修改偏好设置 修改和增加其实是一样的
//获取NSUserDefault类实例
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//更新数字类型
[userDefaults setBool:YES forKey:@"BoolKey"];
[userDefaults setInteger:456 forKey:@"IntegerKey"];
[userDefaults setFloat:3.14 forKey:@"FloatKey"];
[userDefaults setDouble:9.87654 forKey:@"DoubleKey"];
//更新字符串类型
[userDefaults setObject:@"World" forKey:@"StringKey"];
//更新NSData类型
NSData *data = [@"new Data" dataUsingEncoding:NSUTF8StringEncoding];
[userDefaults setObject:data forKey:@"DataKey"];
//更新数组类型
NSArray *array = @[@"four",@"five",@"six"];
[userDefaults setObject:array forKey:@"ArrayKey"];
//更新字典类型
NSDictionary *dict = @{@"key5":@"value5",@"key6":@"value6",@"key7":@"value7"};
[userDefaults setObject:dict forKey:@"DictionaryKey"];
[userDefaults synchronize];//将存储的偏好存储内容同步到ROM中
}
- (IBAction)deletePreference:(id)sender {
//获取NSUserDefaults实例
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
//存储数字值
[userDefaults removeObjectForKey:@"BoolKey"];
[userDefaults removeObjectForKey:@"IntegerKey"];
[userDefaults removeObjectForKey:@"FloatKey"];
[userDefaults removeObjectForKey:@"DoubleKey"];
//存储字符串值
[userDefaults removeObjectForKey:@"StringKey"];
//存储NSData值
[userDefaults removeObjectForKey:@"NSDataKey"];
//存储数组值
[userDefaults removeObjectForKey:@"ArrayKey"];
//存储字典值
[userDefaults removeObjectForKey:@"DictionaryKey"];
//同步数据
[userDefaults synchronize];
}
- (IBAction)clearAllPreference:(id)sender {
//删除所有偏好存储
//获得应用的域的字符串
NSString *appDomainString = [[NSBundle mainBundle]bundleIdentifier];
//清空偏好存储
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomainString];
}
@end
五. 案例——缓存设置页面
//
// ViewController.m
// SettingDemo
#import "ViewController.h"
@interface ViewController ()<UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *myTextField;
@property (weak, nonatomic) IBOutlet UISwitch *mySwitch;
- (IBAction)switchAction:(UISwitch *)sender;
@property (weak, nonatomic) IBOutlet UISlider *mySlider;
- (IBAction)sliderAction:(UISlider *)sender;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_myTextField.delegate = self;
[self loadPreference];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
//加载偏好存储的值
- (void)loadPreference {
NSString *string = [[NSUserDefaults standardUserDefaults]objectForKey:@"textKey"];
_myTextField.text = string;
BOOL switchValue = [[NSUserDefaults standardUserDefaults]boolForKey:@"switchKey"];
_mySwitch.on = switchValue;
float sliderValue = [[NSUserDefaults standardUserDefaults]floatForKey:@"sliderKey"];
_mySlider.value = sliderValue;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
NSLog(@"字符串变为:%@",textField.text);
//存储/更新字符串的值
[[NSUserDefaults standardUserDefaults] setObject:textField.text forKey:@"textKey"];
//更新偏好存储到ROM中
[[NSUserDefaults standardUserDefaults]synchronize];
}
- (IBAction)switchAction:(UISwitch *)sender {
NSLog(@"开关变为:%d",sender.isOn);
//存储/更新开关的值
[[NSUserDefaults standardUserDefaults] setBool:sender.isOn forKey:@"switchKey"];
[[NSUserDefaults standardUserDefaults]synchronize];
}
- (IBAction)sliderAction:(UISlider *)sender {
NSLog(@"滑块位置:%f",sender.value);
//存储/更新滑块的值
[[NSUserDefaults standardUserDefaults] setFloat:sender.value forKey:@"sliderKey"];
[[NSUserDefaults standardUserDefaults]synchronize];
}
//隐藏键盘
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
@end