Oc语言学习 —— 重点内容总结与拓展(下)
类别(分类)和拓展
分类:
专门用来给类添加新方法
不能给类添加成员属性,添加成员属性也无法取到
注意:其实可与通过runtime 给分类添加属性,即属性关联,重写setter,getter方法
分类中用@property 定义变量,只会生成变量的setter,getter方法的声明,不能生成方法实现和带下划线的成员变量
拓展:
可以说是特殊的分类,也可以称为匿名分类
可以给类添加成员属性,但是是私有变量
可以给类添加方法,也是私有方法
拓展只能本类来用
三种字符串的管理方式
NSString的三种类型:
实际类型 | 说明 | 特点 |
---|---|---|
__NSCFConstantString | 编译时字面量字符串 | 常量区,不可变 |
NSTaggedPointerString | 小型字符串优化类型 | 存储在指针本身中,提高性能 |
__NSCFString | NSMutableString 或动态创建的 NSString | 存储在堆上,可变或不可变 |
__NSCFConstantString
Constant->常量
通俗理解其就是常量字符串,是一种编译时常量。这种对象存储在字符串常量区。
通过打印起retainCount的值,发现很大,2^64 - 1,测试证明对其进行release操作时,retainCount不会产生任何变化是创建之后便无法释放掉的对象。
当我们使用不同的字符串对象进行创建时当内容相同,其对象的地址也相同,这也就证明了常量字符串是一种单例。
这种对象一般通过字面值 @"…"、CFSTR("…") (一种宏定义创建字符串的方法)或者 stringWithString: 方法(现在会报警告⚠️这个方法等同于字面值创建的方法)。
__NSCFString
和 __NSCFConstantString 不同, __NSCFString 对象是在运行时创建的一种 NSString 子类,他并不是一种字符串常量。所以和其他的对象一样在被创建时获得了 1 的引用计数。
这种对象被存储在堆上。
通过 NSString 的 stringWithFormat 等方法创建的 NSString 对象一般都是这种类型。
如果字符串长度大于9或者如果有中文或其他特殊符号(可能是非 ASCII 字符)存在的话则会直接成为 __NSCFString 类型
NSTaggedPointerString
理解这个类型,需要明白什么是标签指针,这是苹果在 64 位环境下对 NSString,NSNumber 等对象做的一些优化。
简单来讲可以理解为把指针指向的内容直接放在了指针变量的内存地址中,因为在 64 位环境下指针变量的大小达到了 8 字节足以容纳一些长度较小的内容。于是使用了标签指针这种方式来优化数据的存储方式。
从其的引用计数可以看出,这也是一个释放不掉的单例常量对象。当我们使用不同的字符串对象进行创建时当内容相同,其对象的地址也相同。在运行时根据实际情况创建。
对于 NSString 对象来讲,当非字面值常量的数字,英文字母字符串的长度小于等于 9 的时候会自动成为 NSTaggedPointerString 类型。(小于等于9这个数据也是原博主进行猜测,经过测试在字符串含有q的时候是小于等于7)
三种字符串类型的copy/ mutablecopy / retainCount情况
总结就是
无论原来的三个的类型是NSString还是NSMutableString类型
copy 会使原来的对象引用计数加一(当然仅有正常类型的字符串,而不是单例创建的,毕竟那两个引用计数是无限的),并拷贝对象地址给新的指针,所以类型与原类型一致。
mutableCopy 不会改变引用计数,会拷贝内容到堆上,生成一个 __NSCFString 对象,新对象的引用计数为1.
内存分布补充
_NSCFConstantString
对于ConstantString,我们想查看内存分布情况,直接打印str得到的其实是str这个指针的地址信息,前8位是isa指针,17到24位是对应常量字符串的地址,25~32位是字符串的长度。
__NSCFString
与__NSCFConstantString的存储常量的地址不同
__NSCFString直接将对应字符串的ASCII码存储在之前17~24字节存储对应字符串地址的地方,而不是通过再存一个地址来进行存储。
所以对于常量字符串的单例来说,仅仅存储地址,哪怕后面再创建新的字符串,但是只要内容相同,str对象里面存储的该字符串的地址都是一样的。而对于CFString来说,每个对象都是新的,每个对象都是由自己内部的地址来直接存储,省略了再次通过地址获取内容的步骤。大家哪怕内容相同,自己也是自己的。
其实存在于堆中的
NSTaggedPointerString
所以taggedPointer是进行了一个编码的过程,在Mac10.14和iOS12之前,对value做异或操作的objc_debug_taggedpointer_obfuscator值为0,之后为objc_debug_taggedpointer_obfuscator &= ~_OBJC_TAG_MASK。
所以我们想得到解码,重新声明全局变量objc_debug_taggedpointer_obfuscator和内联函数_objc_decodeTaggedPointer就好了
Tagged Pointer是一个特殊的指针,不指向任何实质地址。使用编码的方式产生一个假地址,在需要时,通过解码方式得到其内部存储的数据。TaggedPointer极大的提高了内存利用率和简化了查询步骤。它不单单是一个指针,还包括了其值+某些具体信息(比如个数等等),节省了对象的查询流程。
关于三种字符串的管理方式这部分,详情可以参考学长的博客[iOS开发]NSString的三种类型管理方式_ios nsstring 类型-CSDN博客
这一部分有些无聊。。
多态
oc中指针变量有两个,一个是编译时的类型,一个是运行时的类型
编译时的类型由声明该变量时使用的类型决定
运行时的类型与实际赋给该变量的对象决定
如果编译和运行的类型不一致就可能出现所谓的多态
FKBaba:
#import "FKBaba.h"@implementation FKBaba-(void) baba {NSLog(@"别墅里面唱k");
}
-(void) test {NSLog(@"我送阿叔茶具");
}
@end
FKSon:
#import "FKSon.h"@implementation FKSon-(void)son {NSLog(@"水池里面银龙鱼");
}
-(void) test {NSLog(@"研磨下笔亲手为我提笔字:大展宏图");
}
@end
main:
将子类对象赋给父类指针变量,这里就出现了多态。
a编译时是FKBaba类型,运行时是FKSon类型
同时指针变量在编译时只能调用其编译类型所具有的方法,但在运行时将执行运行时类型所具有的方法。
我们以这个程序为例子,虽然我们定义了父类的指针变量,但我们指针变量所指向的对象是子类。
所以我们只能调用父类中的方法,但是因为我们的变量实际指向子类,所以我们用的方法实际上是子类覆盖父类的方法或父类继承给子类的方法。
这也是我们在上面单独调用子类方法会出错的原因。
当把一个子类对象直接赋给父类指针变量,例如我们上方的初始化操作,a变量编译时是FKBaba类型,运行时类型是FKSon。当运行时调用该指针变量的方法,其方法行为总是表现出子类方法的行为特征。这就可能出现:相同类型的变量调用同一个方法呈现出不同的行为特征,这就是多态
当把一个子类对象直接赋给父类指针变量,例如我们上方的初始化操作,a变量编译时是FKBaba类型,运行时类型是FKSon。当运行时调用该指针变量的方法,其方法行为总是表现出子类方法的行为特征。这就可能出现:相同类型的变量调用同一个方法呈现出不同的行为特征,这就是多态
而在这个程序中,编译时 [b son]; 不会报错,因为a在编译时系统认为其是FKSon类型,但是运行时就不行了,会报错
那为什么[a baba]又可以通过编译呢? 因为FKSon是FKBaba,自动继承了FKBaba的所有非私有成员方法,所以FKSon的对象自然可以调用FKBaba的方法!
当然了,在这个程序中我迷把一个FKBaba对象赋值给FKSon*类型的变量,这在逻辑上不合理。
FKSon是FKBaba的子类,你可以把FKSon指针赋给FKBaba(向上转型),但是不能向下转型,除非你显示强转。
二、指针类型强制转换
这一点与C语言十分类似。
除了id类型变量之外,指针变量只能调用编译时的类型方法,而不能调用运行时的类型方法所以我们需要将变量类型强制转换为运行时的类型,也就是对象的类。
协议与委托
规范、协议与接口
类是一种具体的实现题,而协议这是定义了一种规范,定义了某一类所需要遵守的规范。
协议不提供任何实现,它体现的是规范和实现分离的设计哲学。
让规范和实现分离正是协议的好处,是一种松耦合的设计。
tips:OC中协议的作用就相当于其他语言中接口的作用。
协议定义的是多个类共同的公共行为规范,协议里通常定义的是一组公用方法,但不会为这些方法提供实现,方法的实现则交给类去实现。
使用类别实现非正式协议
#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface NSObject (EaTable)
-(void) Lai;@endNS_ASSUME_NONNULL_END
#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface FKLaiCai : NSObject
-(void) Lai;@endNS_ASSUME_NONNULL_END
#import "FKLaiCai.h"@implementation FKLaiCai
-(void) Lai {NSLog(@"虔诚拜三拜,钱包里面多几百");
}
@end
#import <Foundation/Foundation.h>
#import "FKLaiCai.h"int main(int argc, const char * argv[]) {@autoreleasepool {FKLaiCai* Laicai = [[FKLaiCai alloc] init];[Laicai Lai];}return 0;
}
运行结果:
正式协议
定义正式协议的时候,不再使用@interface,@implementation关键字了,而是使用@protocol关键字,定义正式协议语法如下:
@protocol 协议名<父协议1,父协议2>{多个方法定义}
对于上述语法,做出以下详细说明:
1、协议名应与类名采用相同的命名规则
2、一个协议可以有多个字节父协议,但协议只能继承协议,不能继承类
3、协议中定义的方法只有方法签名,没有方法实现
4、协议中包含的方法可以是类方法,也可以是实例方法
tips:因为协议定义的是多个类共同的公共行为规范,所以,协议里所有的方法都是公开的访问权限。
//Printable.h#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@protocol Printable <NSObject>@required
-(void)printInfo;@endNS_ASSUME_NONNULL_END
//Person.h#import <Foundation/Foundation.h>
#import "Printable.h"NS_ASSUME_NONNULL_BEGIN@interface Person : NSObject<Printable>@property (nonatomic,copy) NSString* name;
@property (nonatomic,assign) NSInteger age;@endNS_ASSUME_NONNULL_END
//Person.m#import "Person.h"@implementation Person-(void) printInfo {NSLog(@"Name: %@, Age: %ld", self.name, self.age);
}- (NSString *)infoSummary {return [NSString stringWithFormat:@"%@ is %ld years old.", self.name, (long)self.age];
}
@end
#import "Person.h"
#import "Printable.h"int main(int argc, const char * argv[]) {@autoreleasepool {Person *p = [[Person alloc] init];p.name = @"揽佬";p.age = 99;[p printInfo];}return 0;
}
我们也可以一个协议,这个协议同时继承两个协议:
#import <Foundation/Foundation.h>
#import "FKOutput.h"
#import "FKProductable.h"NS_ASSUME_NONNULL_BEGIN//定义协议,继承了FKutput、FKProductable两个协议
@protocol FKPrintable <FKOutput, FKProductable>
//定义协议的方法
- (NSString*) printColor;@endNS_ASSUME_NONNULL_END
tips:协议的继承和类的继承不一样,协议完全支持多继承,即一个协议可以有多个直接的父协议。和类继承相似,子协议继承某个父协议,将会获得父协议中的所有方法。一个协议继承多个父协议时,多个父协议排在<>中间,多个协议口见以(,)隔开。
遵守(实现协议)
在类的接口可以继承该类继承的父类,以及遵守的协议,一个类可以同时遵守多个协议,语法如下:
@interface 类名:父类<协议1, 协议2...>
如果程序需要使用协议来定义变量,有以下两种语法:
- NSObject<协议1,协议2...>* 变量;- id<协议1,协议2...>* 变量;
协议的意义
1,在多个类具有相同行为时,如果没有协议,你必须知道每个对象的具体类型并单独处理。
NSArray<id<Printable>> *objects = @[p, d, r];for (id<Printable> obj in objects) {[obj printInfo]; // 不关心具体类名
}
但是在使用协议后,只要你遵守了协议,我就可以调用你的方法。
2,解耦代码,实现高内聚
正式协议与非正式协议
非正式协议通过为NSObject创建类别来实现,而正式协议直接使用@protocol创建;
遵守非正式协议通过继承带特定类别的NSObject来实现,而遵守正式协议则有专门的OC语法来实现;
遵守非正式协议不要求实现协议中定义的所有方法;而遵守正式协议则必须实现协议中定义的所有方法。
为了弥补遵守正式协议必须实现协议的所有方法造成灵活性不足,在OC还有两个关键字:
@optional:位于该关键字只后、@required或@end之前声明的方法是可选的,实现类可选择是否实现这些方法。
@required:位于该关键字之后、@optional或@end之前声明的方法是必需的,实现类必需实现这些方法。
通过在正式协议中使用以上两个关键字,正式协议完全可以代替非正式协议的功能。
协议与委托
协议体现的是一种规范,定义协议的类可以把协议定义的方法委托给实现协议的类,这样可以让类定义具有更好的通用性,因为具体的动作将由该协议的实现类去完成。无论是基于Mac的Cococa应用开发还是iOS开发,各种应用程序大量依赖委托这个概念。
深拷贝与浅拷贝
本人拙作呈上:
OC语言学习——对象复制-CSDN博客
相关文章:
Oc语言学习 —— 重点内容总结与拓展(下)
类别(分类)和拓展 分类: 专门用来给类添加新方法 不能给类添加成员属性,添加成员属性也无法取到 注意:其实可与通过runtime 给分类添加属性,即属性关联,重写setter,getter方法 分类…...
智脑进化:神经网络如何从单层感知机迈向深度学习新纪元
第一章:神经元的启示——从生物大脑到人工神经元 1.1 生物神经元的智慧:860亿神经元的协同网络 人类大脑的860亿神经元通过突触形成动态网络,每个神经元通过树突接收信号,在胞体整合后经轴突传递输出。这种“接收-处理-输出”的…...
雷云4 鼠标滚轮单击失灵解决办法
问题现象:打开雷云4 ,滚轮单击才有反应,退出雷云4,滚轮单击没反应。 解决方案: 打开雷云4, 选中鼠标中键,选择鼠标功能,选择滚轮单击,保存 然后退出后, …...
Spring Cloud动态配置刷新:@RefreshScope与@Component的协同机制解析
在微服务架构中,动态配置管理是实现服务灵活部署、快速响应业务变化的关键能力之一。Spring Cloud 提供了基于 RefreshScope 和 Component 的动态配置刷新机制,使得开发者可以在不重启服务的情况下更新配置。 本文将深入解析 RefreshScope 与 Component…...
vue2集成可在线编辑的思维导图(simple-mind-map)
最近要求做一个可在线编辑的思维导图,经过层层调研和实测,最简单的思维导图导图实现还得是simple-mind-map组件 simple-mind-map中文文档 当前我使用的是vue2项目,目前没试过是否支持vue3,但是看官网描述他们也给了有vue3的demo项…...
【开源Agent框架】CAMEL:角色扮演+任务分解
一、项目概览:重新定义智能体协作范式 CAMEL(Communicative Agents for “Mind” Exploration of Large Language Model Society)是由camel-ai社区开发的开源多智能体框架,致力于探索智能体的规模法则(Scaling Laws)。该项目通过构建包含百万级智能体的复杂社会系统,研…...
Elasticsearch-kibana索引操作
1索引模版 添加索引 PUT /_index_template/account_transaction {"priority": 0,"index_patterns": ["account_transaction*"],"template": {"settings": {"index": {"number_of_shards": "50&q…...
【python编程从入门到到实践】第十章 文件和异常
一、读取文件 pi_digits.txt3.1415926535897932384626433832791.读取文件的全部内容 # file_reader.pyfrom pathlib import Pathpath Path("pi_digits.txt") contents path.read_text() print(contents)2.相对文件路径和绝对文件路径 当相对路径行不通时&#x…...
Reactive与Ref的故事
Vue 3的两位"响应式英雄":Reactive与Ref的故事 基本介绍:响应式的两种武器 Vue 3提供了两种创建响应式数据的主要API:reactive()和ref()。它们像两种不同的魔法工具,各有所长,共同构建Vue的响应式王国。 ┌────────────────────────…...
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
1. 引言 在旅游行业和城市规划中,热门景点的数据分析具有重要意义。通过爬取景点数据并生成热力图,可以直观展示游客分布、热门区域及人流趋势,为商业决策、景区管理及智慧城市建设提供数据支持。 然而,单机爬虫在面对大规模数据…...
MySQL数据库——支持远程IP访问的设置方法总结
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实…...
现在环保方面有什么新的技术动态
环保领域的技术发展迅速,尤其在“双碳”目标、数字化转型和可持续发展背景下,涌现出许多创新技术和应用。以下是当前环保领域的新技术动态(截至2024年): 一、碳中和与碳减排技术 CCUS(碳捕集、利用与封存&a…...
[模型部署] 1. 模型导出
👋 你好!这里有实用干货与深度分享✨✨ 若有帮助,欢迎: 👍 点赞 | ⭐ 收藏 | 💬 评论 | ➕ 关注 ,解锁更多精彩! 📁 收藏专栏即可第一时间获取最新推送🔔…...
Neo4j 图书馆借阅系统知识图谱设计
一、数据模型设计 节点类型 读者(Reader) 属性: reader_id, name, age, gender, phone, email, register_date 图书(Book) 属性: book_id, title, author, publisher, publish_date, isbn, price, category 图书副本(BookCopy) 属性: copy_id, status (在馆/借出/维修), loca…...
android 安装openwrt 安正步骤
安装 QEMU 模拟器 bash 复制 编辑 pkg install wget pkg install qemu-utils pkg install qemu-system-aarch64-headless 可选 x86 模拟支持: bash 复制 编辑 pkg install qemu-system-x86-64-headless ✅ 下载 OpenWRT 镜像(armvirt 64) bash 复制 编辑 mkdir -p ~/openwr…...
大规模CFD仿真计算中,SIMPLE或者PISO算法中加速压力场方程迭代求解
文章目录 在SIMSOL或PISO算法中加速压力场方程的迭代求解是提高CFD计算效率的关键。以下从算法优化、数值技巧和并行计算等方面总结加速策略:**1. 压力方程求解器的选择与优化****2. 算法层面的加速****3. 离散格式与网格优化****4. 并行计算与硬件加速****5. 代码级…...
【C#】 lock 关键字
在 C# 里,lock 关键字就是对 Monitor.Enter/Exit 的简写。它的作用是保证“同一时刻只有一个线程能进入被保护的代码块”,从而避免多个线程同时修改同一个共享状态导致竞态条件(race condition)。 一、结合Jog 的例子讲解 // Mot…...
前端脚手架开发指南:提高开发效率的核心操作
前端脚手架通过自动化的方式可以提高开发效率并减少重复工作,而最强大的脚手架并不是现成的那些工具而是属于你自己团队量身定制的脚手架!本篇文章将带你了解脚手架开发的基本技巧,帮助你掌握如何构建适合自己需求的工具,并带着你…...
职坐标AIoT技能培训课程实战解析
职坐标AIoT技能培训课程以人工智能与物联网技术深度融合为核心,构建了“理论实战行业应用”三位一体的教学体系。课程体系覆盖Python编程基础、传感器数据采集、边缘计算开发、云端服务部署及智能硬件开发全链路,通过分层递进的知识模块帮助学员建立系统…...
Yocto Project 快速构建
此文为机器辅助翻译,仅供个人学习使用,如有翻译不当之处欢迎指正 1 Yocto 项目快速构建 1.1 欢迎! 本简短文档将引导您完成使用 Yocto Project 进行典型镜像构建的流程,并介绍如何为特定硬件配置构建环境。您将使用 Yocto Proj…...
git相关配置
git相关配置 欢迎使用Markdown编辑器修改Git默认编辑器为vimgit配置默认用户名和密码: 欢迎使用Markdown编辑器 修改Git默认编辑器为vim #方法1:直接执行 git config --global core.editor vim#方法2:修改git的配置文件.git/config文件&am…...
ci/cd全流程实操
本次采用架构,gitlab + jenkins + 镜像仓库+ k8s 准备工作 一、gitlab部署 拉取镜像 部署环境: macbook m2中docker部署gitlab (m2平台架构问题,这里只能用yrzr/gitlab-ce-arm64v8 这个容器镜像) docker pull yrzr/gitlab-ce-arm64v8 在 Docker 里,–privileged=tr…...
Python中in和is关键字详解和使用
在 Python 中,in 和 is 是两个常用但含义不同的关键字,初学者很容易混淆它们的用法。下面是关于它们的详细解释、注意事项及常见示例。 一、关键字 in:成员运算符 1. 功能 用于判断某个元素是否存在于序列(如列表、元组、字符串…...
ACM模式用Scanner和System.out超时的解决方案和原理
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:笔试强训 📚本系列文章为个人学…...
微服务中服务降级和异常的区别
在Java中,服务降级和异常处理是两个相关但不同的概念。它们的主要区别如下: 1. 服务降级(Service Degradation): 定义:服务降级是指在系统中某个服务或功能出现问题时,通过采取某些策略来降低服务的质量或…...
MYSQL创建索引的原则
创建索引的原则包括: 表中的数据量超过10万以上时考虑创建索引。 选择查询频繁的字段作为索引,如查询条件、排序字段或分组字段。 尽量使用复合索引,覆盖SQL的返回值。 如果字段区分度不高,可以将其放在组合索引的后面。 对于…...
29、魔法微前端——React 19 模块化架构
一、时空结界分割术(模块化架构设计) 1. 次元切割协议 // 主应用入口const HogwartsMain () > {const [subApps] useState({potion: React.lazy(() > import(./PotionShop)),library: React.lazy(() > import(./LibraryApp)),quidditch: R…...
【PmHub后端篇】PmHub 中缓存与数据库一致性的实现方案及分析
在软件开发项目中,缓存的使用十分普遍。缓存作为一种存储机制,能够暂时保存数据,从而加速数据的读取和访问。然而,当数据同时存在于缓存和数据库中时,如何保证两者的数据一致性成为了一个关键问题。在 PmHub 项目中&am…...
Verilog HDL 语言整理
Verilog HDL 语言 Verilog HDL 简介 硬件描述语言Hardware Description Language是一种用形式化方法即文本形式 来描述和设计数字电路和数字系统的高级模块化语言 Verilog HDL(Hardware Description Language)是一种硬件描述语言,用于建模…...
[250516] OpenAI 升级 ChatGPT:GPT-4.1 及 Mini 版上线!
目录 ChatGPT 迎来重要更新:GPT-4.1 和 GPT-4.1 mini 正式上线用户如何访问新模型?技术亮点与用户体验优化 ChatGPT 迎来重要更新:GPT-4.1 和 GPT-4.1 mini 正式上线 OpenAI 宣布在 ChatGPT 平台正式推出其最新的 AI 模型 GPT-4.1 和 GPT-4.…...
R语言学习--Day03--数据清洗技巧
在一般情况下,我们都是在数据分析的需求前提下去选择使用R语言。而实际上,数据分析里,百分之八十的工作,都是在数据清洗。并不只是我们平时会提到的异常值处理或者是整合格式,更多会涉及到将各种各样的数据整合&#x…...
文件系统交互实现
关于之前的搭建看QT控件文件系统的实现-CSDN博客,接下来是对本程序的功能完善,我想着是这样设计的,打开一个目录以后,鼠标选中一个项可以是目录,也可以是文件,右键可以出现一个菜单选择操作,比如…...
SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。
/// <summary> /// SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。 /// </summary> public class SqlHelper : IDbHelper {private readonly IDbConnectionFactory _connectionFactory;private…...
DevExpressWinForms-RichEditControl-基础应用
RichEditControl-基础应用 在企业级WinForms应用开发中,富文本编辑与文档处理是常见需求。DevExpress WinForms的RichEditControl作为一款功能强大的富文本编辑控件,提供了媲美Microsoft Word的文档处理能力,支持复杂格式编辑、打印导出、界…...
Elasticsearch 索引副本数
作者:来自 Elastic Kofi Bartlett 解释如何配置 number_of_replicas、它的影响以及最佳实践。 更多阅读:Elasticsearch 中的一些重要概念: cluster, node, index, document, shards 及 replica 想获得 Elastic 认证?查看下一期 Elasticsearc…...
RabbitMQ 扇形交换器工作原理详解
目录 一、扇形交换器简介二、扇形交换器工作原理2.1 消息广播机制2.2 路由键的忽略三、代码示例3.1 生产者代码3.2 消费者代码四、实际应用场景4.1 日志收集系统4.2 实时通知系统4.3 事件驱动架构五、总结在 RabbitMQ 的众多交换器类型中,扇形交换器(Fanout Exchange)是一种…...
IDEA中springboot项目中连接docker
具体内容如下: 1、在Linux中安装docker 使用安装命令: apt-get install docker.io 还有一个是更新软件并安装docker: sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io 运行docker systemctl start …...
arxiv等开源外文书数据的获取方式
一、一些基本说明 开放API接口文档:https://info.arxiv.org/help/api/user-manual.html#2-api-quickstart研究领域分类说明文档:https://arxiv.org/category_taxonomy 二、基于url接口方式检索并获取数据 本质是get方式,在url中传检索参数…...
ChatGPT再升级!
近日,OpenAI 正式发布 GPT-4.1 和轻量级版本 GPT-4.1mini,并已全面上线 ChatGPT 平台,迅速引发全球 AI 圈热议,标志着 ChatGPT 在智能化和效率上再登新高峰。 GPT-4.1 是为编程与任务处理优化的高性能模型。相较前作 GPT-4o&#…...
23、电网数据管理与智能分析 - 负载预测模拟 - /能源管理组件/grid-data-smart-analysis
76个工业组件库示例汇总 电网数据管理与智能分析组件 1. 组件概述 本组件旨在模拟一个城市配电网的运行状态,重点关注数据管理、可视化以及基于模拟数据的智能分析,特别是负载预测功能。用户可以通过界面交互式地探索电网拓扑、查看节点状态、控制时间…...
#跟着若城学鸿蒙# web篇-获取定位
前言 在业务中,某些网页上需要获取用户的地理位置,然后按照用户搜索的兴趣点与用户的距离远近进行排序,这就需要h5能够获取到用户的位置。 由于 web 组件基于Chromium M114 版本开发,前端就可以使用navigator.geolocation.getC…...
前端批量下载文件打包为zip
多文件需要一次性下载为zip文件 这是近期遇到的一个需求,本身是多文件上传的,下载时单个下载太慢又繁杂,用户希望能一次性批量下载,就选择了jszip import axios from "axios" import JSZip from "jszip" im…...
Vue百日学习计划Day9-15天详细计划-Gemini版
重要提示: 番茄时钟: 每个番茄钟为25分钟学习,之后休息5分钟。每完成4个番茄钟,进行一次15-30分钟的长休息。灵活性: JavaScript 的概念较多,尤其是 this、原型链、闭包和异步编程,可能需要更多…...
MySQL8.x新特性:与mysql5.x的版本区别
MySQL8.x新特性 1.与mysql5.x的区别:MySQL8.x新特性:与mysql5.x的版本区别-CSDN博客 2.窗口函数(Window Functions):MySQL8.x新特性:窗口函数(Window Functions)-CSDN博客 引言 …...
RabbitMQ 消息模式实战:从简单队列到复杂路由(三)
精准投递:路由模式 路由模式详解 路由模式是 RabbitMQ 中一种功能强大且灵活的消息传递模式,它在发布订阅模式的基础上,引入了路由键(Routing Key)的概念,实现了消息的精准路由和分发 。在路由模式中&…...
STM32 定时器主从模式配置解析
STM32 定时器主从模式配置解析 下面这两行代码是配置STM32定时器主从模式的关键设置 代码功能解析 TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2); // 选择从模式输出的触发源 TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 选择从模式1. TIM_SelectInputTrigger(T…...
Leetcode76覆盖最小子串
覆盖最小子串 代码来自b站左程云 class Solution {public String minWindow(String str, String tar) {char[] s str.toCharArray();char[] t tar.toCharArray();int[] cnt new int[256];for (char cha : t) { cnt[cha]--;}int len Integer.MAX_VALUE;int debt t.length…...
Perl语言深度考查:从文本处理到正则表达式的全面掌握
阅读原文 前言:为什么Perl依然值得学习? "这个脚本用Perl写只需要5分钟!"——在当今Python大行其道的时代,你依然能在不少企业的运维部门听到这样的对话。Perl作为一门有着30多年历史的语言,凭借其强大的文…...
idea中Lombok失效的解决方案
Lombok 是一个 Java 库,旨在通过注解简化 Java 代码的编写,减少样板代码,提高开发效率。它通过自动生成常见的代码(如 getter、setter、构造函数等)来减少开发者的手动编码工作。 一般Lombok失效有四步排查方案&#…...
【LeetCode 热题 100】动态规划 系列
📁 70. 爬楼梯 状态标识:爬到第i层楼梯时,有多少种方法。 状态转移方程:dp[i] dp[i-1] dp[i-2],表示从走一步和走两步的方式。 初始化:dp[1] 1 , dp[2] 2。 返回值:dp[n],即走到…...