NSUserDefaults是iOS与 macOS 中的一个存储对象。它用于存储应用程序运行期间和退出后需要保存的数据。
NSUserDefaults的特点:- 基于键值对:使用字符串作为键名存储数据。
- 支持的类型:NSString、NSNumber、NSDate、NSArray、NSDictionary等基本数据结构。
- 存储在本地:数据存储在本地文件中,不会因为应用程序退出而丢失。
- 可以监听变化:可以注册通知监听 NSUserDefaults 对象变化。通过 NSUserDefaults ,我们可以存储:- 应用设置:比如亮度、声音等用户偏好设置
- 配置信息:分辨率、访问权限、主题等配置
- 用户信息:用户名、头像、地区等
- 状态信息:在应用程序重新启动后仍然有效。
使用步骤:
1. 获取默认的用户defaults对象:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
2. 写入要存储的数据:
[defaults setObject:@"用户1" forKey:@"username"];
可以写入的值有:NSString、NSNumber、NSDate、NSArray、NSDictionary。
3. 读取缓存的数据:
NSString *username = [defaults stringForKey:@"username"];
4. 注册defaults变化通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsDidChange:) name:NSUserDefaultsDidChangeNotification object:nil];
5. 监听通知:
- (void)defaultsDidChange:(NSNotification *)notification { // 注册的defaults值发生变化,会触发这个方法 NSLog(@"修改了%@",[notification.object stringForKey:@"username"]); }
6. 移除通知监听:
[[NSNotificationCenter defaultCenter] removeObserver:self];
完整代码:
AppDelegate.m
// // AppDelegate.m // viewtest // // Created by 001 on 2023/5/9. // #define WYColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0] #import "AppDelegate.h" #import "labelpage.h" #import "imgpage.h" @interface AppDelegate () @end @implementation AppDelegate - (void)defaultsDidChange:(NSNotification *)notification { // 注册的defaults值发生变化,会触发这个方法 NSLog(@"修改了%@",[notification.object stringForKey:@"username"]); } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:@"用户1" forKey:@"username"]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsDidChange:) name:NSUserDefaultsDidChangeNotification object:nil]; labelpage *labelpageview = [[labelpage alloc] init]; imgpage *imgpageview = [[imgpage alloc] init]; self.window.rootViewController = imgpageview; [self.window makeKeyAndVisible]; NSLog(@"执行了"); return YES; } #pragma mark - UISceneSession lifecycle @end
imgpage.m
// // imgpage.m // blog // // Created by 001 on 2023/7/2. // #import "imgpage.h" #import <AVFoundation/AVFoundation.h> @interface imgpage () @end @implementation imgpage - (void)viewDidLoad { UIImageView *imgview = [[UIImageView alloc] init]; imgview.frame =CGRectMake((self.view.frame.size.width-100)/2, (self.view.frame.size.height-100)/2, 100, 100); NSURL *url = [NSURL URLWithString:@"https://img0.baidu.com/it/u=1752903520,1572100722&fm=253&fmt=auto&app=138&f=JPEG?w=521&h=500"]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; imgview.image = image; // imgview.image = [UIImage imageNamed:@"icon"]; // //设置圆角 // imgview.layer.cornerRadius = imgview.frame.size.width / 2; // //将多余的部分切掉 // imgview.layer.masksToBounds = YES; // //开始对imageView进行画图 // UIGraphicsBeginImageContextWithOptions(imgview.bounds.size, NO, 1.0); // //使用贝塞尔曲线画出一个圆形图 // [[UIBezierPath bezierPathWithRoundedRect:imgview.bounds cornerRadius:imgview.frame.size.width] addClip]; // [imgview drawRect:imgview.bounds]; // imgview.image = UIGraphicsGetImageFromCurrentImageContext(); // //结束画图 // UIGraphicsEndImageContext(); UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imgview.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:imgview.bounds.size]; CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init]; //设置大小 maskLayer.frame = imgview.bounds; //设置图形样子 maskLayer.path = maskPath.CGPath; imgview.layer.mask = maskLayer; self.view.backgroundColor = [UIColor whiteColor]; [self.view addSubview:imgview]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:@"234" forKey:@"username"]; NSString *username = [defaults stringForKey:@"username"]; NSLog(@"用户名称%@",username); [super viewDidLoad]; // Do any additional setup after loading the view. } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end
效果图: