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