数据存储——NSUserDefaults (IOS开发)

曹浩淼
2023-12-01

1,NSUserDefaults是iOS系统提供的一个单例类(iOS提供了若干个单例类),通过类方法standardUserDefaults可以获取NSUserDefaults单例。如:NSUserDefaults *default = [NSUserDefaults standardUserDefaults];

(一般对于一些基本的用户设置,因为数据量很小,可以使用 NSUserDefaults类来进行处理。使用方法简单!)

2,  NSUserDefaults单例以key-value的形式存储了一系列偏好设置,key是名称,value是相应的数据。

存数据时可以使用方法setObject:forKey:来把对象存储到相应的plist文件中;

取数据时可以使用方法objectForKey:读取相应的plist文件中的数据

3,数据对象存入plist文件,那么对象的类型则必须是plist文件可以存储的类型,

  • NSData
  • NSString
  • NSNumber
  • NSDate
  • NSArray
  • NSDictionary
  • BOOL
  • NSInteger
  • NSFloat

支持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系统定义的数据类型,如果要存放其他数据类型或者自定义的对象(如自定义的类对象),则必须将其转换成NSData存储。即使对象是NSArray或NSDictionary,他们存储的类型也应该是以上范围包括的。

 

3.1.    举例子://###存:存一个整数、字符串和一张图片

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setObject:@"jack“" forKey:@"firstName"];

    [defaults setInteger:10 forKey:@"Age"];

    

    UIImage *image =[UIImage imageNamed:@"somename"];

    NSData *imageData = UIImageJPEGRepresentation(image, 100);//把image归档为NSData

    [defaults setObject:imageData forKey:@"image"];

 

        [defaults synchronize];

 

其中,方法synchronise是为了强制存储,其实并非必要,因为这个方法会在系统中默认调用,但是你确认需要马上就存储,这样做是可行的。

注意事项:存储时,如果value的值是"<null>",直接存到NSUserdefaults中,程序会崩溃掉。这个时候就要进行判断,如果传的值为"<null>",则变为@"";就可以存储了。

    NSString *value = @"将要存储的信息";

    NSString *object = ![value isEqual:

                         [NSNull null]] ? value:@"";

    [[NSUserDefaults standardUserDefaults] setObject:object forKey:yourKey];

 

3.2.    举例子://###读:读一个整数、字符串和一张图片

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSString *firstName = [defaults objectForKey:@"firstName"];

    NSInteger age = [defaults integerForKey:@"Age"];

    

    NSData *imageData = [defaults dataForKey:@"image"];

    UIImage *image = [UIImage imageWithData:imageData];

通过为三个数据设置key的方式把NSIntegerNSStringUIImage三种数据存储下来,其中图片是通过归档为NSData的方式进行存储的,除此之外,还可以被转为NSNumberNSString类型。顺便提一句,这里NSInteger没有星号(*),因为NSInteger根据系统是64位还是32位来判断自身是long还是int类型,并且它也不是一个标准Objective-C对象。

4,  简便方法存不同类型数据:

//存数据

   

NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

    [userDefault setObject:@"admin"forKey:@"user_name"];

    

    - setObject:forKey:

    - setFloat:forKey:

    - setDouble:forKey:

    - setInteger:forKey:

    - setBool:forKey:

    - setURL:forKey:

    

    UIImage *image =[UIImage imageNamed:@"somename"];

    NSData *imageData = UIImageJPEGRepresentation(image, 100);

    //把image归档为NSData

    [userDefault setObject:imageData forKey:@"image"];

    [userDefault synchronize];

    

    

    //保存数据:保存UIcolor类型的,超出上面的5种数据类型,就要进行归档,把它们归档成data类型的数据之后再保存。

    NSData *objColor = [NSKeyedArchiver archivedDataWithRootObject:[UIColor redColor]];

    [[NSUserDefaults standardUserDefaults] setObject:objColor forKey:@"myColor"];

    

    //读取数据:

    //NSData *objColor = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];

    //UIColor *myColor = [NSKeyedUnarchiver unarchiveObjectWithData:objColor];

 

5,  简便方法取不同类型数据:

//读数据

NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

    [userDefault objectForKey:@"user_name"];

        - objectForKey:

    - URLForKey:

    - arrayForKey:

    - dictionaryForKey:

    - stringForKey:

    - stringArrayForKey:

    - dataForKey:

    - boolForKey:

    - integerForKey:

    - floatForKey:

    - doubleForKey:

    - dictionaryRepresentation

 

6,移除数据

[[NSUserDefaults standardUserDefaults] removeObjectForKey:KTreeFuncGuideIndex];

        [[NSUserDefaults standardUserDefaults] synchronize];

 

7,立即写入 synchronize

NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:

[userDefault synchronize];

 

域的概念以及其用法

 

8,在NSUserDefault中存在域的概念,包含5个部分:

NSArgumentDomain,

Application,

NSGlobalDomain,

Languages,

NSRegistrationDomain。

 

NSArgumentDomain:

代表的是命令行参数,可以在Edit Scheme->Arguments->Arguments Passed On Launch中添加,格式是-key value。

 

Application:

应用程序域,设置的方法默认数据保存是在这里

 

NSGlobalDomain:

全局域,所有应用程序都将公用该域

 

Languages:

国际化语言版本域

 

NSRegistrationDomain:

临时域,- (void)registerDefaults:(NSDictionary*)registrationDictionary方法被调用是数据是保存在这里。

 

在读取数据时,都会在底层的存储结构中进行一次搜索,搜索的顺序是这样:

NSArgumentDomain->Application->NSGlobalDomain->Languages->NSRegistrationDomain

 

 

NSUserDefaults官方文档:

https://developer.apple.com/documentation/foundation/nsuserdefaults?language=objc

 类似资料: