一. 偏好存儲使用場景
- 用戶存儲偏好設置
- 緩存信息
- 輕量級數(shù)據存儲
- 不可用于存儲大量數(shù)據
- 不要濫用synchronize方法
- 警惕數(shù)據被清空袋坑,因為NSUserDefaults是單例類褒颈,代碼的任何地方都可以將它刪除
二. 偏好存儲工作原理
三. 偏好存儲支持的數(shù)據類型
不可存儲可變類型
不可存儲可變類
四. 偏好存儲的增加、讀取瞧掺、修改纹腌、刪除
//
// 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];
//存儲數(shù)字類型
[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"];
//存儲數(shù)組類型
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];
//讀取數(shù)字值
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);
//讀取數(shù)組值
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];
//更新數(shù)字類型
[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"];
//更新數(shù)組類型
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];
//存儲數(shù)字值
[userDefaults removeObjectForKey:@"BoolKey"];
[userDefaults removeObjectForKey:@"IntegerKey"];
[userDefaults removeObjectForKey:@"FloatKey"];
[userDefaults removeObjectForKey:@"DoubleKey"];
//存儲字符串值
[userDefaults removeObjectForKey:@"StringKey"];
//存儲NSData值
[userDefaults removeObjectForKey:@"NSDataKey"];
//存儲數(shù)組值
[userDefaults removeObjectForKey:@"ArrayKey"];
//存儲字典值
[userDefaults removeObjectForKey:@"DictionaryKey"];
//同步數(shù)據
[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(@"字符串變?yōu)椋?@",textField.text);
//存儲/更新字符串的值
[[NSUserDefaults standardUserDefaults] setObject:textField.text forKey:@"textKey"];
//更新偏好存儲到ROM中
[[NSUserDefaults standardUserDefaults]synchronize];
}
- (IBAction)switchAction:(UISwitch *)sender {
NSLog(@"開關變?yōu)椋?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