首页 > 其他分享 >IOS开发-NSUserDefaults的基本使用,缓存数据实现数据持久化

IOS开发-NSUserDefaults的基本使用,缓存数据实现数据持久化

时间:2023-07-02 17:13:34浏览次数:31  
标签:username self IOS 缓存数据 defaults NSUserDefaults imgview imgpage

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

效果图:

 

标签:username,self,IOS,缓存数据,defaults,NSUserDefaults,imgview,imgpage
From: https://www.cnblogs.com/SadicZhou/p/17520997.html

相关文章

  • IOS开发-常用的输出类型总结
    int类型%d或者%ichar型%cfloat型%f(具体限制输出的位数,根据c语言中的规则)oc对象%@(BOOL类型也可以使用%@输出,一般情况不直接输出BOOL的值)NSUInteger类型%lu(该类型是无符号整型,相当于unsignedlong) 举例:intn=1;NSLog(@"%i",n);NSLog(@“%d”,n); char......
  • IOS开发-iOS中电话号码和邮箱判断
    在iOS应用中我们经常会遇到一些个人信息的设置,需要判断用户输入的信息是否正确,电话号码和邮箱等是否符合要求,下面直接上代码:1,判断字符串是否是电话号码:-(BOOL)checkTelNumber:(NSString*)telNumber{NSString*pattern=@"^1+[3578]+\\d{9}";NSPredicate*pred=[N......
  • IOS开发-使用UIImageView加载网络图片
    使用UIImageView加载网络图片可以分为三步1.创建UIImageView实例:UIImageView*imgview=[[UIImageViewalloc]init];imgview.frame=CGRectMake((self.view.frame.size.width-100)/2,(self.view.frame.size.height-100)/2,100,100); 2.下载图片数据:NSUR......
  • IOS开发-UIImageView基本用法
    UIImageView是iOS中用于显示图像(图片、gif、svg等)的视图。它的主要功能有:1.显示图片UIImageView可以通过image属性显示一张UIImage类型的图片。可以是本地图片、从网络下载的图片等。2.设置填充模式可以通过contentMode属性设置图片在UIImageView内的显示和填充模式。内容......
  • IOS开发-UIColor的基本用法
    1.使用预定义的系统颜色UIKit框架内预定义了一些常用的颜色,我们可以直接使用:UIColor*redColor=[UIColorredColor];UIColor*blueColor=[UIColorblueColor];UIColor*greenColor=[UIColorgreenColor];UIColor*blackColor=[UIColorblackColor];UIColor......
  • IOS开发-设置UILabel行间距lineSpacing
    1.如何设置UILabel行间距lineSpacing UILabel是没有这么一个直接暴露的属性的,想要修改lineSpacing,我们需要借助NSAttributedString来实现。NSMutableParagraphStyle*style=[NSMutableParagraphStylenew];style.lineSpacing=15;NSMutableDictionary*attribu......
  • IOS开发-实现一个高度自适应的UILabel和一个宽度自适应的UILabel
    1.实现一个高度自适应的UILable思路:UILabel初始化之后,先不要设置他的宽度和高度,等到设置好text属性和font属性之后,根据text的长度以及font的大小来计算UILabel控件的高度//实现一个高度自适应的uilabelUILabel*label2=[[UILabelalloc]init];label2.text=@"xxx......
  • IOS下的微信H5页面的底部前进后退横栏如何隐藏
    header里增加<metaname="viewport"content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"/>重点:viewport-fit=cover加上后向下滚动时自动隐藏前进后退横栏,一定程度上解决了遮挡底部的问题,向上滚动后又会出现......
  • axios 合并两个请求
      例子functiongetStaffList(){returnaxios.get('/api/staff');}functiondeptListGet(){returnaxios.get('/api/dept');}axios.all([getStaffList(),deptListGet()]).then(axios.spread(function(staffRes,deptRes){//两......
  • ios 隐私信息访问的许可描述
    相册读我们需要获取访问您设备相册的权限,以便您能够选择并上传图片或视频到我们的应用中。相册-写我们需要获取写入权限,以便我们能够将您通过应用程序拍摄的照片或视频保存到您的设备相册中。摄像头需要扫描二维码或拍照,是否允许打开相机?运行期访问位置如您同意提供位置信......