iOS學習筆記--04 NSUserDefaults

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


當然,如果是存儲多個user對象,則先將User轉爲NSData對象,將其存入數組,再存入NSUserDefaults。


參考:http://my.oschina.net/u/1245365/blog/294449


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章