iOS NSUserDefaults

李昊苍
2023-12-01

前言

我们在使用APP时常用的一个功能:用户第一次进入APP时自动进入登录注册界面,提示用户注册登录,用户登录成功后才进入主页,再次进入APP时,不用再次登录就直接进到主页了,就算杀掉该APP进程再次进入,依然进入主页.
苹果给我们iOS开发者提供了一个NSUserDefault类,用来持久化存储用户的登录信息,只有卸载APP才能抹掉这些登陆信息.

简介

NSUserDefaults用来存储 用户设置 系统配置等一些小的数据。
因为数据是明文存储在 plist 文件中,不安全,即使只是修改一个 key 都会 load 整个文件,数据多加载慢(IO 内存),不适合存储大量数据。
它是单例的,也是线程安全的,是以键值对 key-value 的形式保存在沙盒中
存储路径为:沙盒路径的Library——>Preferences文件夹中
相当于全局的变量
支持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系统定义的数据类型,如果要存放其他数据类型或者自定义的对象(如自定义的类对象),则必须将其转换成NSData存储。
在进行自定义对象的归档时需要实现NSCoding协议,不实现协议方法则抛出异常。
NSUserDefaults返回的值是不可改变的,即使存储的时候是可变的值。
对相同的Key赋值约等于一次覆盖。

使用

存储数据

这里我存储了两个数据,以object为例:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:self -> _myView.accountTextField.text forKey:@"account"];
[userDefaults setObject:currentUserModel.name forKey:@"name"];

系统定义的数据类型:

    - setObject:forKey:
    - setFloat:forKey:
    - setDouble:forKey:
    - setInteger:forKey:
    - setBool:forKey:
    - setURL:forKey:

其他数据类型:

UIImage *image =[UIImage imageNamed:@"header"];
NSData *imageData = UIImageJPEGRepresentation(image, 100);
//把image归档为NSData
[userDefault setObject:imageData forKey:@"image"];

查看是否已经存在数据

在 AppDelegate.m 中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];
    
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    //如果有数据
    if ([userDefaults objectForKey:@"account"]) {
    //直接转至主界面
        PLMainViewController *main = [[PLMainViewController alloc] init];
        self.window.rootViewController = main;
    } else {
    //跳转到登陆界面
        PLLoginViewController *login = [[PLLoginViewController alloc] init];
        self.window.rootViewController = login;
    }
    
    [self.window makeKeyWindow];
    return YES;
}

系统定义的数据类型:

    - objectForKey:
    - URLForKey:
    - arrayForKey:
    - dictionaryForKey:
    - stringForKey:
    - stringArrayForKey:
    - dataForKey:
    - boolForKey:
    - integerForKey:
    - floatForKey:
    - doubleForKey:
    - dictionaryRepresentation

清除数据

一般写在退出账号button的实现方法中

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults removeObjectForKey:@"accountNumber"];
[userDefaults removeObjectForKey:@"name"];

立即写入 synchronize

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

[userDefaults synchronize];

参考文献

iOS-NSUserDefaults

 类似资料:

相关阅读

相关文章

相关问答