首页 > 其他分享 >特性语法-补充

特性语法-补充

时间:2023-12-26 18:32:45浏览次数:28  
标签:12 name 补充 self 特性 语法 2566753 49180 sleep

NSUserDefaults

以K-V键值对的形式存储到本地文件(plist),使用时非常方便(小量数据使用)

  • 使用
  • 存储
  • NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:@"jack" forKey:@"name"];
    [user setInteger:18 forKey:@"age"];
    [user synchronize];
  • 取出
  • NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    NSInteger age = [user integerForKey:@"age"];
    NSString *name = [user objectForKey:@"name"];
    NSLog(@"age = %ld, name = %@", (long)age, name);

KVC

KVC的全称是Key-Value Coding。中文就是我们所熟知的键值编码,键值编码是NSKeyValueCoding非正式协议启用的一种机制。对象采用该协议来间接访问该对象属性(既:可以通过一个key值来访问)。这种间接访问机制补充了实例变量及其相关的访问器方法所提供的直接访问.

  • 设置和访问
@interface Book : NSObject{
    @private
        NSString *name;
}
@end


@implementation Book

@end


Book *book = [Book new];
键值访问
[book setValue:@"OCprogram" forKey:@"name"];
NSString *name = [book valueForKey:@"name"];
路径访问
[book setValue:@"OCprogram" forKeyPath:@"name"];
NSString *name = [book valueForKeyPath:@"name"];
NSLog(@"%@", name);
  • 简单运算
一个作者写了很多书
作者里有一个NSArray的books
书有价格
NSString *sum = [author valueForKeyPath:@"[email protected]"];
min、max、avg同理

KVO

全称Key-Value observing,就是键值观察,KVO是一种监听机制,它将观察的指定对象属性更改后通知到观察者

在KVO的官方文档中官方文档传送门可以知道,KVO与KVC关系密切,因为KVO的监听属性值变化,这个属性赋值用的是KVC。

KVO是一对多的。

实例

用护士观察孩子的快乐值为例

  • child.h
@interface Child : NSObject
@property(nonatomic,assign)int happyVal;
@end
  • child.m
@implementation Child
-(id)init{
    if(self = [super init]){
        self.happyVal = 100;
        [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];
    }
    return self;
}
-(void)timeAction:(NSTimer *)timer{
    self.happyVal --;
}
@end
  • Nurse.h
@interface Nurse : NSObject
@property Child *child;
-(id)initWithChild:(Child *)child;
-(void)removeObserver;
@end
  • Nurse.m
@implementation Nurse
- (id)initWithChild:(Child *)child{
    if(self = [super init]){
        self.child = child;
        //什么地方写都行,可以一对多
        [_child addObserver:self forKeyPath:@"happyVal" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld
                    context:nil];
    }
    return self;
}
-(void)removeObserver{
    [_child removeObserver:@"happyVal" forKeyPath:@"happyVal"];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    NSLog(@"%@", change);
}
@end

Main

Nurse *nurse = [[Nurse alloc] initWithChild:[Child new]];
[[NSRunLoop currentRunLoop] run];
Run loop 是一个事件处理循环,用于调度和协调线程的工作,等待并处理各种事件(如用户输入、定时器事件、网络事件等)。

NSNotification-通知

和KVO类似,是用来管理通知的接收和发送的.也是一对多的。

  • 实例:

孩子有一个NSInteger的sleep,变动时给父亲发通知

  • Child.h
@interface Child : NSObject
@property(nonatomic,assign)NSInteger sleep;
@end
  • Child.m
@implementation Child
-(id)init{
    if(self = [super init]){
        self.sleep = 100;
        [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
    }
    return self;
}
-(void)timerAction:(NSTimer *)timer{
    self.sleep --;
    NSLog(@"当前的sleep = %ld", _sleep);
    if(_sleep < 90){
        NSNumber *sleepNumber = [NSNumber numberWithLong:_sleep];
        NSMutableDictionary *dict = [NSMutableDictionary new];
        dict[@"sleep"] = sleepNumber;
        dict[@"flag"] = @"weak";
        [[NSNotificationCenter defaultCenter] postNotificationName:@"weak_sleep" object:sleepNumber userInfo:dict];
        [timer invalidate];
    }
}
@end
  • Father.h
@interface Father : NSObject

@end
  • Father.m
@implementation Father
-(id)init{
    if(self = [super init]){
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(weekNotification:) name:@"weak_sleep" object:nil];
    }
    return self;
}
-(void)weekNotification:(NSNotification *)notification{
    NSNumber *num =  notification.object;
    NSMutableDictionary *dict = notification.userInfo;
    NSLog(@"小孩子醒了,sleep = %@, dict = %@", num, dict);
}
@end
  • Main
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Child *child = [[Child alloc]init];
        
        Father *father = [[Father alloc]init];
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}
  • 结果

2023-12-20 17:47:23.117046+0800 通知[49180:2566753] 当前的sleep = 99

2023-12-20 17:47:24.121308+0800 通知[49180:2566753] 当前的sleep = 98

2023-12-20 17:47:25.116591+0800 通知[49180:2566753] 当前的sleep = 97

2023-12-20 17:47:26.119006+0800 通知[49180:2566753] 当前的sleep = 96

2023-12-20 17:47:27.116444+0800 通知[49180:2566753] 当前的sleep = 95

2023-12-20 17:47:28.117030+0800 通知[49180:2566753] 当前的sleep = 94

2023-12-20 17:47:29.119510+0800 通知[49180:2566753] 当前的sleep = 93

2023-12-20 17:47:30.117480+0800 通知[49180:2566753] 当前的sleep = 92

2023-12-20 17:47:31.116692+0800 通知[49180:2566753] 当前的sleep = 91

2023-12-20 17:47:32.119179+0800 通知[49180:2566753] 当前的sleep = 90

2023-12-20 17:47:33.121476+0800 通知[49180:2566753] 当前的sleep = 89

2023-12-20 17:47:33.121677+0800 通知[49180:2566753] 小孩子醒了,sleep = 89, dict = {

flag = weak;

sleep = 89;

}

谓词

相当于过滤器,指定过滤条件,将符合条件的对象保留下来。

  • 创建
+ (NSPredicate *)predicateWithFormat:(NSString *)predicateFormat, ...;

Person-------(int)age
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<%d",22];
.....
  • 使用
NSArray *array = [array filteredArrayUsingPredicate:predicate];

- (NSArray<ObjectType> *)filteredArrayUsingPredicate:(NSPredicate *)predicate;    
// evaluate a predicate against an array of objects and return a filtered array
- (BOOL)evaluateWithObject:(nullable id)object;    
// evaluate a predicate against a single object


标签:12,name,补充,self,特性,语法,2566753,49180,sleep
From: https://blog.51cto.com/u_16456705/8986283

相关文章

  • 文件概述补充
    ......
  • 正则语法
    正则字符组[字符组]在同一个位置可能出现的各种字符组成了一个字符组在正则表达式中用[]表示[0123456789]#匹配0-9中某个字符的单个结果[0-9] #匹配0-9中某个字符的单个结果[a-z] #匹配a-z中某个字符的单个结果[A-Z] #匹配A-Z中某个字......
  • 什么是语法糖
    语法糖在编程领域中,"语法糖"(SyntacticSugar)是一个术语,用于描述一种编程语言的特性或构造,它使得代码更简洁、易读或符合程序员的习惯,而不会改变其基本语义或运行效果。简而言之,语法糖是一种让代码看起来更甜、更友好的语法表现形式。举个例子来帮助理解:解构赋值:在JavaScript中......
  • Mysql报语法错误,排查竟然花了一个钟!!!!
    背景:最近协助远程同事开发一个功能,我调用同事写的接口,发现报错,,同事正在处理其他事情,暂时无暇顾及。遂自行解决。查看日志发现,发现一个inser语句报语法错误。解决过程:1、找到报错的日志,查看sql。如果没有,打开mybatis-plus日志输出。2、将sql复制出来在mysql客户端模拟执行,发现sql......
  • Python内置语法手册
    一、引入​ 在Python中有很多不常见内置函数,内置语法,为了方便查阅使用。现在将它们进行归纳。二、内置函数#abs():返回数字的绝对值abs(-7)#>>>7#all():如果参数里的可迭代对象中所有值都是True,则返回True。空值为Falseall(['1','',1])#>>>False#any():如果可......
  • IGP协议高级特性
    一、快速收敛  1.i-SPF增量SPF算法:    初始收敛时,使用Full-SPF算法计算去往拓扑构建最短路径树    当最短路径树出现变更,只对变更的部分进行i-SPF计算,未出现变更的部分不需要         重新计算,减少设备资源的消耗,提高收敛速度  ......
  • 深入了解 Spring Boot 核心特性、注解和 Bean 作用域
    SpringBoot是什么?SpringBoot是基于SpringFramework构建应用程序的框架,SpringFramework是一个广泛使用的用于构建基于Java的企业应用程序的开源框架。SpringBoot旨在使创建独立的、生产级别的Spring应用程序变得容易,您可以"只是运行"这些应用程序。术语SpringCor......
  • Markdown 语法学习
    Markdown学习标题的添加​ 一级标题:#一级标题内容​ 二级标题:##二级标题内容​ 三级标题:###三级标题内容​ 以此内推文字格式​ 划线:~~+文字内容+~~​ 粗体文字:**+文字内容+**​ 斜体文字:*+文字内容+*​ 斜粗体文字:三个*,中间加文字内容分割线......
  • C#版本与.NET版本对应关系以及各版本的特性
    C#版本与.NET版本对应关系以及各版本的特性 C#版本.NET版本发布日期特性C#1.0.NETFramework1.02002-02-13委托、事件C#1.1.NETFramework1.12003-04-24APM(异步编程模型)C#2.0.NETFramework2.02005-11-07泛型、匿名方法、迭代器、可空类型C#......
  • 【CUMT计算机系统设计】Verilog语法概览
    基操标识符区分大小写,逻辑值不区分首字符必须为字母/下划线1. 模块Module有I/O功能的黑盒2.逻辑块always构建组合and时序逻辑块:if,case,for...always@(...)begin……end上升沿posedge下降沿negedgegenerate主要结合for:对向量......