ISO之NSUserDefaults

来源:互联网 发布:微信公众号 java demo 编辑:程序博客网 时间:2024/05/29 19:29


NSUserDefaults是一个单例,并且线程安全。它支持的数据类型有:NSNumber(NSInteger、float、double...),NSString,NSDate,NSArray,NSDictionary,BOOL...

NSArry和NSDictionary中存储的也只能是上面这些,不能存储自定义类型,除非自定义类型遵守NSCoding协议并实现相应的方法。


1、先看一下NSUserDefaults里面默认存储的东西

    //获取设备上所有NSUserDefaults的设置    NSDictionary * userDefaultsDict = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];    NSLog(@"%@", userDefaultsDict);

输出:

2015-11-11 11:03:20.055 01-nsuserdefaults[1035:41606] {    AddingEmojiKeybordHandled = 1;    AppleITunesStoreItemKinds =     (        podcast,        artist,        "itunes-u",        booklet,        document,        movie,        eBook,        software,        "software-update",        "podcast-episode"    );    AppleLanguages =     (        "en-US"    );    AppleLanguagesDidMigrate = "9.1";    AppleLocale = "en_US";    ApplePasscodeKeyboards =     (        "en_US"    );    MSVLoggingMasterSwitchEnabledKey = 0;    NSInterfaceStyle = macintosh;    NSLanguages =     (        "en-US",        en    );}

具体信息不再详细解释,因为我也不是很清楚,0..0


2、NSUserDefaults支持的数据类型

    NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];        int testInt = 20;    float testFloat = 21.00;    double testDouble = 22.000000;    [userDefaults setInteger:testInt forKey:@"testInt"];    [userDefaults setDouble:testDouble forKey:@"testDouble"];    [userDefaults setFloat:testFloat forKey:@"testFloat"];        BOOL testBool = YES;    [userDefaults setBool:testBool forKey:@"testBool"];        NSString * testString = @"testNSString";    [userDefaults setObject:testString forKey:@"testString"];        //NSData读取一张图片    //不能存NSMutableData    NSString * jpgPath = [[NSBundle mainBundle] pathForResource:@"test1" ofType:@"jpg"];    NSData * testData = [NSData dataWithContentsOfFile:jpgPath];    [userDefaults setObject:testData forKey:@"testData"];        //日期    NSDate * testDate = [NSDate date];    [userDefaults setObject:testDate forKey:@"testDate"];        //不能存NSMutableArray    NSArray * testArray = @[@"t1", @"t2", @"t3"];    [userDefaults setObject:testArray forKey:@"testArray"];        //不能存NSMutableDictionary    NSDictionary * testDict = @{@"key1":@"value1", @"key2":@"value2", @"key3":@"value3"};    [userDefaults setObject:testDict forKey:@"testDict"];        [userDefaults synchronize];//同步一下,不写也可以        //注:    //总之不能存可变类型,取的时候也不能用可变类型接收,否则可变类型也变为不可变类型                    //取数据    NSInteger fetchInt = [userDefaults integerForKey:@"testInt"];    NSLog(@"fetch int - %li", (long)fetchInt);        float fetchFloat = [userDefaults floatForKey:@"testFloat"];    NSLog(@"fetch float - %f", fetchFloat);        double fetchDouble = [userDefaults doubleForKey:@"testDouble"];    NSLog(@"fetch double - %f", fetchDouble);        BOOL fetchBool = [userDefaults boolForKey:@"testBool"];    NSLog(@"fetch bool - %i", fetchBool);        NSString * fetchStr = [userDefaults stringForKey:@"testString"];    NSLog(@"fetch NSString - %@", fetchStr);        //取出图片并显示    NSData * fetchData = [userDefaults dataForKey:@"testData"];    UIImage * image = [UIImage imageWithData:fetchData];    UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];    imageView.image = image;    imageView.backgroundColor = [UIColor orangeColor];    [self.view addSubview:imageView];            //读取日期类型数据    NSDate * fetchDate = [userDefaults valueForKey:@"testDate"];    NSLog(@"fetch Date - %@", fetchDate);        NSArray * fetchArray = [userDefaults arrayForKey:@"testArray"];    NSLog(@"fetch NSArray - %@", fetchArray);        NSDictionary * fetchDict = [userDefaults dictionaryForKey:@"testDict"];    NSLog(@"fetch NSDictionary - %@", fetchDict);

输出:

2015-11-11 12:10:57.269 01-nsuserdefaults[1595:72935] fetch int - 202015-11-11 12:10:57.270 01-nsuserdefaults[1595:72935] fetch float - 21.0000002015-11-11 12:10:57.270 01-nsuserdefaults[1595:72935] fetch double - 22.0000002015-11-11 12:10:57.271 01-nsuserdefaults[1595:72935] fetch bool - 12015-11-11 12:10:57.271 01-nsuserdefaults[1595:72935] fetch NSString - testNSString2015-11-11 12:10:57.324 01-nsuserdefaults[1595:72935] fetch Date - 2015-11-11 04:10:57 +00002015-11-11 12:10:57.324 01-nsuserdefaults[1595:72935] fetch NSArray - (    t1,    t2,    t3)2015-11-11 12:10:57.324 01-nsuserdefaults[1595:72935] fetch NSDictionary - {    key1 = value1;    key2 = value2;    key3 = value3;}
图片输出:


3、遵守NSCoding协议,使其支持自定义数据类型

person测试类:

#import <Foundation/Foundation.h>@interface Person : NSObject <NSCoding>@property(nonatomic, copy) NSString * name;@property(nonatomic, assign) NSInteger age;@end


#import "Person.h"@implementation Person- (void)encodeWithCoder:(NSCoder *)aCoder{    [aCoder encodeObject:self.name forKey:@"name"];    [aCoder encodeInteger:self.age forKey:@"age"];}- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{    if (self = [super init]) {        self.name = [aDecoder decodeObjectForKey:@"name"];        self.age = [aDecoder decodeIntegerForKey:@"age"];    }    return self;}@end

测试数据:

    Person * person = [[Person alloc] init];    person.name = @"dzl";    person.age = 25;        NSData * dataPerson = [NSKeyedArchiver archivedDataWithRootObject:person];    NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];    [userDefaults setObject:dataPerson forKey:@"dataPerson"];    [userDefaults synchronize];        //取数据    NSData * fetchDataPerson = [userDefaults objectForKey:@"dataPerson"];    Person * fetchPerson = [NSKeyedUnarchiver unarchiveObjectWithData:fetchDataPerson];    NSLog(@"person.name = %@, person.age = %li", fetchPerson.name, (long)fetchPerson.age);

输出:

2015-11-11 12:31:09.589 01-nsuserdefaults[1756:80720] person.name = dzl, person.age = 25

其实NSString NSDictionary NSData NSDate 等都遵守NSSecureCoding协议,此协议又遵守NSCoding协议





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机下雨天进水声音出了问题怎么办 胸太小了该怎么办经常揉胸会变大吗 鼻冲洗器冲鼻子耳朵进水怎么办 手表进水了然后里面有水珠怎么办 玩游戏后头晕恶心想吐怎么办 吃完美林3小时后又发烧怎么办 颜值和身材都是负分怎么办 妈妈离婚又有一个孩子我该怎么办 孩子妈妈天天给孩子吃药我该怎么办 被像蚂蚁有翅膀的虫子咬了怎么办 1周半宝宝扭脚丫肿了怎么办 离婚后前夫带孩子走了找不到怎么办 宜昌全视之眼逃出卢浮宫怎么办 qq号被盗了密保手机也被改怎么办 乐视盒子控播平台认证怎么办 购买冲气娃娃被发现了怎么办 买了充气娃娃太美舍不得扔怎么办 一品官老爷账号密码忘了怎么办 苹果手机加声音显示出耳机怎么办 被删除的照片恢复后效果变差怎么办 w10系统玩刺激战场声音小怎么办 宝宝不咳嗽但是喉咙有痰怎么办 深圳限行如果车堵在路上怎么办 奔跑吧qq中奖我填写资料怎么办 微信之前绑定的手机号丢了怎么办 龙之谷手游换装备洗炼材料怎么办 小学生在班上碰到流氓同学怎么办 问道手游仓库密码忘了怎么办 问道手游安全码忘了怎么办 问道手游账号密码忘了怎么办 坐一天一夜长途车腰疼怎么办 智联的简历一直说不完整怎么办 智联招聘简历投错了怎么办 投简历的公司写错面试时怎么办 从原单位辞职后档案一直没提怎么办 手机因一些不良软件扣费怎么办 苹果手机玩崩坏3卡顿怎么办 以前很帅现在变得好难看了怎么办 偷了室友东西被发现了该怎么办 自己不喜欢狗但室友养狗怎么办 夏天身上闷热出很多小红豆怎么办?