Oc语言学习 —— 重点内容总结与拓展(上)
隐藏和封装
有四种访问控制符:==@private(当前类访问权限),@package(与映像访问权限相同),@protect(子类访问权限),@public(公共访问权限)。
访问控制符
1.private(当前类访问权限)
成员变量只能在当前类的内部被访问,用于彻底隐藏成员变量。在类的实现部分定义的成员变量默认使用这种访问权限。
2.package(与映像访问权限相同)
成员变量可以在当前类以及当前类实现的同一个映像的任意地方进行访问。用于部分隐藏成员变量
3.protected(子类访问权限)
成员变量可以在当前类,当前类的子类的任意地方进行访问。类的接口部分定义的成员变量默认这个访问权限
4.public(公共访问权限)
这个成员变量可以在任意地方进行访问。
理解@package访问控制符
@package使受他控制的成员变量不仅可以在当前类访问,还可以在相同映像的其他程序中访问。关键何为相同映像?
同一映像的概念:
简单的说,就是编译后生成的同一个框架或同一个执行文件,当我们想开发一个基础框架时,如果用private就限制的太死了,其他函数可能需要直接访问这个成员变量,但是该框架又不希望外部程序访问我们的成员变量,就可以考虑用package了
当编译器最后把@package限制的成员变量所在的类,其他类,函数编译成一个框架库后,这些类、函数就都在一个映像中(注意这里的函数包括我们的主函数)。也就是说当我们使用@package之后我们的主函数也可以调用我们的成员变量,但是当其他程序引用这个框架库时,由于其他程序与这个框架库不在一个映像中,其他程序就无法访问我们的被@package限制的成员变量。
对象初始化
一、为对象分配空间
无论创建哪个对象,我们都先需要使用alloc方法来分配我们的内存,alloc方法来自NSObject类,而所有的类都是他的子类。
我们调用alloc方法时,系统帮我们完成以下的事情。
1、系统为我们的所有实例变量分配内存空间
2、将每个实例变量的内存空间都置为0,同时对应的类型置为对应的空值。
仅仅分配内存空间的对象还不能使用,还需要执行初始化,也就是init才可以使用它。
二、初始化方法与对象初始化
重写一个init来代替NSObject的init
#import "Person.h"@implementation Person-(id) init {if (self = [super init]) {self.name = @"四川芬达";self.saying = @"他们朝我扔粑粑";self.age = 123;}return self;
}@end
NS_ASSUME_NONNULL_BEGIN@interface Person : NSObject@property (nonatomic,copy) NSString* name;
@property (nonatomic,copy) NSString* saying;
@property (nonatomic,assign) NSInteger age;@endNS_ASSUME_NONNULL_END
#import <Foundation/Foundation.h>
#import "Person.h"int main(int argc, const char * argv[]) {@autoreleasepool {Person* singer = [[Person alloc] init];NSLog(@"%@",singer.name);NSLog(@"%@",singer.saying);NSLog(@"%ld",singer.age);}return 0;
}
OC属性及属性关键字
@property
属性用于封装对象中数据,属性的本质是 ivar + setter + getter。
可以用 @property 语法来声明属性。@property 会帮我们自动生成属性的 setter 和 getter 方法的声明。
@synthesize
帮我们自动生成 setter 和 getter 方法的实现以及 _ivar。
你还可以通过 @synthesize 来指定实例变量名字,如果你不喜欢默认的以下划线开头来命名实例变量的话。但最好还是用默认的,否则影响可读性。
如果不想令编译器合成存取方法,则可以自己实现。如果你只实现了其中一个存取方法 setter or getter,那么另一个还是会由编译器来合成。但是需要注意的是,如果你实现了属性所需的全部方法(如果属性是 readwrite 则需实现 setter and getter,如果是 readonly 则只需实现 getter 方法),那么编译器就不会自动进行 @synthesize,这时候就不会生成该属性的实例变量,需要根据实际情况自己手动 @synthesize 一下。
@synthesize ivar = _ivar
@dynamic
告诉编译器不用自动进行 @synthesize,你会在运行时再提供这些方法的实现,无需产生警告,但是它不会影响 @property 生成的 setter 和 getter 方法的声明。@dynamic 是 OC 为动态运行时语言的体现。动态运行时语言与编译时语言的区别:动态运行时语言将函数决议推迟到运行时,编译时语言在编译器进行函数决议。
类、元类、父类的关系
我们先给出类与对象源码的定义:
我们的类实际上就是一个结构体指针。
typedef struct objc_class *Class;
struct objc_class { Class isa; Class super_class; const char *name; long version; long info; long instance_size; struct objc_ivar_list *ivars; struct objc_method_list **methodLists; struct objc_cache *cache; struct objc_protocol_list *protocols;
};
我们再来看看对象的定义:
OC的类其实也是一个对象,一个对象就要有一个它属于的类,意味着类也要有一个isa指针,指向其所属的类。那么类的类是什么?就是我们所说的元类,所以,元类就是类的所属类。
这样我们便可以总结出我们类、元类、父类的基本关系:
isa指向
实例对象的所属类实际上就是其所属类,我们的实例对象就是图中的Instance of Subclass。
接下来我们的isa指向了我们的类,那么继续研究我们类的所属类。
从图中可以看出,我们类的所属类实际上就指向了我们的元类。
接下来我们再看我们的元类,我们所有元类的所属类实际上都是根元类,在笔者参考的资料中是这样理解的,因为我们OC中几乎所有的类都是NSObject的子类,所以我们的根元类也可以认为是我们的NSObject的元类。
接着我们再看图中根元类的虚线,根元类所属的类指向了它本身。
superClass指向
我们这里的superClass指向就是我们类的父类,到了这里其实就比较好理解了,元类与我们的类一样,其父类都是一层层往上的,而不像元类所属的类一样,全部指向我们的根元类
在这里唯一需要注意的是我们的根元类的父类是我们的根类,也可以理解为NSObject类。而NSObject类的父类就是nil了。
isKindOfClass && isMemberOfClass
re1:1 [NSObject类对象 isKindOfClass:[NSObject class]]
NSObject 的元类的继承链最终指向 NSObject 类本身(因为根元类的父类是 NSObject),因此返回 YES(1)re2:0 [NSObject类对象 isMemberOfClass:[NSObject class]]
NSObject 的类对象的元类是 NSObject 的元类(metaclass),而非 NSObject 类本身,因此返回 NO(0)。re3:0 [GGObject类对象 isKindOfClass:[GGObject class]]
GGObject 的元类的继承链未指向 GGObject 类本身(除非显式修改元类继承关系),因此 isKindOfClass: 返回 NO(0)。re4:0 [GGObject类对象 isMemberOfClass:[GGObject class]]
类对象的元类与目标类 GGObject 不匹配,因此 isMemberOfClass: 返回 NO(0)。re5:1 [[NSObject分配的对象] isKindOfClass:[NSObject class]]
实例对象是 NSObject 的直接实例,且 isKindOfClass: 会检查类的继承链。
NSObject 是所有类的根类,因此返回 YES(1)。re6:1 [[NSObject分配的对象] isMemberOfClass:[NSObject class]]
实例对象直接属于 NSObject 类,因此 isMemberOfClass: 返回 YES(1)。re7:1 [[GGObject分配的对象] isKindOfClass:[GGObject class]]
GGObject 实例的类继承自 NSObject,但 isKindOfClass: 会检查到其自身类 GGObject,因此返回 YES(1)。re8:1 [[GGObject分配的对象] isMemberOfClass:[GGObject class]]
实例对象直接属于 GGObject 类,因此 isMemberOfClass: 返回 YES(1)。
isKindOfClasss:判断类或元类继承链是否包含目标类
isMemberOfClass:严格匹配当前类或元类是否等于目标类
特殊:NSObject
的元类的父类是 NSObject
类本身,因此 [NSObject class] isKindOfClass:[NSObject class]
返回 YES
,而其他类(如 GGObject
)的元类无此特性
+isKindOfClass 类方法是从当前类的isa指向 (也就是当前类的元类) 开始,沿着 superclass 继承链查找判断和对比类是否相等。
-isKindOfClass 对象方法是从 [self class] (当前类) 开始,沿着 superclass 继承链查找判断和对比类是否相等。
+isMemberOfClass 类方法是直接判断当前类的isa指向 (也就是当前类的元类) 和对比类是否相等。
-isMemberOfClass 对象方法是直接判断 [self class] (当前类) 和对比类是否相等。
编译结果:
关键字
assign
assign:对属性只是简单赋值,不更改对所赋的值的引用计数,这个指示符主要适用于NSInteger等基本类型,以及short、float、double、结构体等各种C数据类型。它是一个弱引用声明类型,我们一般不使用assign来修饰对象,因为被assign修饰的对象,在被释放掉以后,指针的地址还是存在的,也就是说指针不会被置为nil,造成野指针,可能导致程序崩掉。那为什么assign就能用来修饰基本数据类型呢,是因为基本数据类型一般分布在栈上,栈的内存会由系统自动处理,因此不会造成野指针
weak
weak:该属性也是一个弱引用声明类型,使用weak修饰的对象是不会造成引用计数器+1的,并且引用的对象如果被释放了以后会自动变成nil,不会出现野指针,很好的解决了内存引起的崩溃情况。通常我们会在block和协议的时候使用weak修饰,通过这样的修饰,我们可以规避掉循环引用的问题。
strong
strong:该属性是一个强引用声明类型,只要该强引用指向被赋值的对象,那么该对象就不会自动回收。
retain
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1;在ARC模式下很少使用,通常用于指针变量,就是说你定义了一个变量,然后这个变量在程序的运行过程当中会改变,并且影响到其他方法。一般用于字符串、数组等
copy
copy:若使用copy指示符,则调用setter方法给变量赋值的时候,会将被赋值的对象复制一个副本,再将该副本赋值给成员变量。copy指示符会将原成员变量所引用对象的计数减1。
相当于就是说,不用copy的话,会创建一个新的空间,它的内容和原对象内容一模一样,然后指针是指向新空间的。当再有什么操作在对那个对象操作的话,只是在原空间上操作,对新空间没有影响。当成员变量的类型是可变类型,或其子类是可变类型的时候,被赋值的对象有可能在赋值后被修改,如果程序不需要这种修改影响setter方法设置的成员变量的值,此时就可考虑用copy指示符。
strong、copy
如果属性声明中指定了copy特性,合成方法会使用类的copy方法,这里注意:属性并没有MutableCopy特性。即使是可变的实例变量,也是使用copy特性,正如方法copyWithZone:的执行结果。所以,按照约定会生成一个对象的不可变副本。
相同之处:用于修饰标识拥有关系的对象
不同之处:strong赋值是多个指针指向同一个地址,而copy的复制是每次会在内存中复制一份对象,指针指向不同的地址。所有对于不可变对象我们都应该用copy修饰,为确保对象中的字符串值不会无意变动,应该在设置新属性时拷贝一份。
回顾一下深浅拷贝
深拷贝就是内容拷贝,浅拷贝就是指针拷贝。
深拷贝就是拷贝出来和原来仅仅是值一样,但是内存地址完全不一样的新的对象,创建后和原对象没有任何关系。浅拷贝就是拷贝指向原来对象的指针,使原来的对象的引用计数➕1,可以理解为创建了一个指向原对象的指针的新指针而已,并没有创建一个全新的对象。
#import <Foundation/Foundation.h>
#import "Person.h"int main(int argc, const char * argv[]) {@autoreleasepool {NSMutableString *otherName = [[NSMutableString alloc] initWithString:@"Jack "];Person *person = [[Person alloc] init];person.name = otherName;person.age = 23;[otherName appendString:@"and rose"];NSLog(@"person.name = %@",person.name);}return 0;
}
copy的结果:
strong的结果:
因为otherName是可变的,person.name属性是copy,所以创建了新的字符串,属于深拷贝,内容拷贝,我们拷贝出来了一个对象,后面的赋值操作都是针对新建的对象进行操作,而我们实际的调用还是原本的对象。所以值并不会改变。
如果设置为strong,strong会持有原来的对象,使原来的对象引用计数+1,其实就是浅拷贝、指针拷贝。这时我们进行操作,更改其值就使本对象发生了改变。
我们既然创建的是不可变类型,那我们就不希望其发生改变,所以这个时候我们就应该使用copy关键字,strong会使其在外部被修改时发生改变
那么对于可变类型字符串 ,我们使用copy时,按约定会生成一个对象的不可变副本,此时我们进行增删改操作就会因为找不到对象而崩溃
readonly、readwrite
这是访问权限的控制,决定该属性是否可读和可写,默认是readwrite,所以我们定义属性的时候,一般不需要这个修饰。只有只读属性才加上readonly
readonly来控制读写权限的方式就是只生成setter,不生成getter
单例模式
单例模式是因为在某些时候,程序多次创建这一类的对象没有实际的意义,那么我们就只在程序运行的时候只初始化一次,自然就产生了一个单例模式。
定义:
如果一个类始终只能创建一个实例,则这个类被称为单例类。在程序中,单例类只在程序中被初始化一次,所以单例类是存储在全局区域,在编译时分配内存,只要程序还在运行就一只占用内存,只要在程序结束的时候释放这一部分内存
有三个注意点
- 单例类只有一个实例
- 单例类只能自己创建自己的实例
- 单例类必须给其他对象提供这一实例
#import "Singleton.h"@implementation Singletonstatic Singleton* instance = nil;//静态实例对象
+(instancetype)sharedInstance {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{instance = [[super allocWithZone:NULL] init];});return instance;
}//重写allocWithZone,防止再次创建新实例
+(id) allocWithZone:(NSZone *)zone {return self;
}//实现copy协议,返回同一个实例
-(id)copyWithZone:(NSZone *)zone {return self;
}//实现mutableCopy协议,返回同一个实例
-(id) mutableCopyWithZone:(NSZone *)zone {return self;
}@end
#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface Singleton : NSObject <NSCopying, NSMutableCopying>@property (nonatomic, strong) NSString* data;+(instancetype)sharedInstance;@endNS_ASSUME_NONNULL_END
#import <Foundation/Foundation.h>
#import "Singleton.h"int main(int argc, const char * argv[]) {@autoreleasepool {Singleton *s1 = [Singleton sharedInstance];s1.data = @"Hello, BeijingRDFZ!";Singleton *s2 = [Singleton sharedInstance];NSLog(@"s2.data = %@", s2.data); NSLog(@"s1 == s2 ? %@", (s1 == s2) ? @"YES" : @"NO"); }return 0;
}
我们来打印结果:
重写description方法
我们将我们的值包装成对象后我们肯定就需要打印他了。当我们用NSLog单独打印我们的对象时,实际上是调用我们的description方法来返回我们的类的十六位进制,但是我们并不想要得到这个东西,我们想要得到的是他的值,所以我们就要重写我们的description方法。
@implementation Person- (NSString *)description {return [NSString stringWithFormat:@"Person: name = %@, age = %ld", self.name, (long)self.age];
}@end
==与isEqual与hash
比较方式 | 方法/符号 | 作用 | 是否可重写 | 比较内容 |
---|---|---|---|---|
指针比较 | == | 判断两个对象地址是否相同 | 不可重写 | 内存地址 |
内容比较 | isEqual: | 判断两个对象内容是否相等 | 通常需重写 | 对象内容 |
哈希值比较 | hash | 通常与 isEqual: 搭配使用 | 通常需重写 | 内容生成的整数 |
isEqual 默认是实现是==(也就是地址比较)因此,如果你定义自己的类,要比较内容,必须重写该方法
@implementation Person- (BOOL)isEqual:(id)object {if (![object isKindOfClass:[Person class]]) return NO;Person *other = (Person *)object;return [self.name isEqualToString:other.name] && self.age == other.age;
}
hash:对象的哈希值,用于快速查找和集合操作。默认NSObject会返回一个基于地址的hash。当你重写了isEqual,必须配套重写hash
下面举几个例子:
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end@implementation Person- (BOOL)isEqual:(id)object {if (![object isKindOfClass:[Person class]]) return NO;Person *other = (Person *)object;return [self.name isEqualToString:other.name] && self.age == other.age;
}- (NSUInteger)hash {return self.name.hash ^ self.age;
}@end
@interface Book : NSObject
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *isbn;
@end@implementation Book- (BOOL)isEqual:(id)object {if (![object isKindOfClass:[Book class]]) return NO;return [self.isbn isEqualToString:((Book *)object).isbn];
}- (NSUInteger)hash {return self.isbn.hash; // 因为只看 isbn 是否相同
}@end
@interface UserAccount : NSObject
@property (nonatomic, copy) NSString *username;
@property (nonatomic, copy) NSString *email;
@end@implementation UserAccount- (BOOL)isEqual:(id)object {if (![object isKindOfClass:[UserAccount class]]) return NO;UserAccount *other = object;return [self.username isEqualToString:other.username] &&[self.email isEqualToString:other.email];
}- (NSUInteger)hash {return self.username.hash ^ self.email.hash;
}@end
特别鸣谢:感谢iOS各级学长学姐的博客分享
相关文章:
Oc语言学习 —— 重点内容总结与拓展(上)
隐藏和封装 有四种访问控制符:private(当前类访问权限),package(与映像访问权限相同),protect(子类访问权限),public(公共访问权限)。 访问控制符 1.private(当前类访问权限) 成员变量只能在当前类的内部…...
全面且深度学习c++类和对象(上)
文章目录 过程和对象类的引入,类的定义类的访问限定符及封装类的访问限定符封装 类的实例化类大小内存对齐规则: this指针this特性 过程和对象 C语言面向过程设计,c面向对象设计, 举例:洗衣服 C语言:放衣服…...
QML元素 - RectangularGlow
QML 的 RectangularGlow 是 Qt Quick Effects 模块中专门为矩形元素设计的外发光效果,适用于为卡片、按钮、面板等矩形或圆角矩形添加柔和的边缘光晕,相比通用 Glow 更高效且支持圆角匹配。以下是详细使用技巧和优化指南: 1. 基本用法 impor…...
GraphPad Prism项目的管理
《2025新书现货 GraphPad Prism图表可视化与统计数据分析(视频教学版)雍杨 康巧昆 清华大学出版社教材书籍 9787302686460 GraphPadPrism图表可视化 无规格》【摘要 书评 试读】- 京东图书 GraphPad Prism统计数据分析_夏天又到了的博客-CSDN博客 项目…...
uniapp自定义日历计划写法(vue2)
文章目录 uniapp自定义日历计划写法(vue2)1、效果2、实现源码前言:我们有时候需要实现的日历找不到相应的插件的时候,往往需要手动去写一个日历,以下就是我遇到这样的问题时,手搓出来的一个解决方案,希望可以帮助到更多的人。创作不易,请多多支持uniapp自定义日历计划写…...
差分探头为什么要选择使用屏蔽双绞线
市面上很多各种品牌的差分探头,其使用的线缆都使用了屏蔽双绞线(STP),这主要是因为在测试过程中因高压线路周围强电场或磁场在信号线与地线间感应出共模电压而产生的电磁耦合效应会对测试结果产生干扰,而屏蔽双绞线可以…...
Qt—用SQLite实现简单的注册登录界面
1.实现目标 本次实现通过SQLite制作一个简易的登录窗口,当点击注册按钮时,登录窗口会消失,会出现一个新的注册界面;完成注册或退出注册时,注册窗口会消失,重新出现登录窗口。注册过的用户信息会出现在SQLi…...
Visual Studio旧版直链
[Visual Studio 2019 社区版](https://aka.ms/vs/16/release/vs_community.exe) [Visual Studio 2019 专业版](https://aka.ms/vs/16/release/vs_professional.exe) [Visual Studio 2019 企业版](https://aka.ms/vs/16…...
elementUI源码学习
学习笔记。 最近在看element的table表格优化,又去看了一下element源码框架。element 的架构是很优秀,通过大量的脚本实现工程化,让组件库的开发者专注于事情本身,比如新加组件,一键生成组件所有文件,并完成…...
【LeetCode 热题 100】搜索插入位置 / 搜索旋转排序数组 / 寻找旋转排序数组中的最小值
⭐️个人主页:小羊 ⭐️所属专栏:LeetCode 热题 100 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 搜索插入位置搜索二维矩阵在排序数组中查找元素的第一个和最后一个位置搜索旋转排序数组寻找旋转排序数组中的最小值…...
捌拾伍- 量子傅里叶变换 (3)
前期的内容在 捌拾叁- 量子傅里叶变换 前期的内容在 捌拾肆- 量子傅里叶变换 (2) 9. 之前的 之前的公式写错了! Markdown 的 KaTeX 真难用!!! 而且之前的公式是从 j1 – jn ,但量子计算都是从 0 开始的,…...
探索ISBN查询接口:为图书管理系统赋能
在开发图书管理应用时,ISBN(国际标准书号)查询接口是获取图书元数据的核心工具。通过扫描图书条形码得到ISBN,再调用API即可轻松获取书名、作者、出版社、封面等信息。本文详细介绍几种主流ISBN查询API,包括国际和国内…...
Linux 内核中 inet_accept 的实现与自定义传输协议优化
在 Linux 内核中,网络协议栈的核心功能由一系列精心设计的函数实现,其中 inet_accept 是 TCP 协议接受新连接的关键入口。本文将深入分析该函数的实现逻辑,并探讨在实现自定义传输协议时如何权衡性能优化与代码简化。 一、inet_accept 函数解析 1. 功能概述 inet_accept 是…...
SAP-ABAP:SAP DMS(文档管理系统)的详细说明,涵盖其核心功能、架构、配置及实际应用
1. DMS 概述 SAP DMS(Document Management System)是SAP系统中用于管理企业文档的核心模块,支持文档的全生命周期管理(创建、存储、版本控制、审批、归档)。它与其他模块(如物料管理MM、生产计划PP、设备维…...
前端方法的总结及记录
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...
【Arthas实战】常见使用场景与命令分享
简介: Arthas是一款Java诊断工具,适用于多种场景,如接口响应变慢、CPU占用过高、热更新需求等。其核心命令包括实时监控面板(dashboard)、线程状态查看(thread)、方法调用链路追踪(trace&#x…...
SearchClassUtil
路径扫描工具SearchClassUtil,用于扫描指定包(XXXX)下的所有.class文件,并将它们的全限定类名(如tomcat.SearchClassUtil)收集到列表中返回。该工具使用递归文件遍历和反射机制,是实现 Spring 框…...
开放世界地形渲染:以三角洲行动为例(下篇)
本文主要介绍如何提升室外画面渲染的品质 版权声明 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明文章内容不得删减、修改、演绎本文视频版本:见文末 渲染品质提升 要提升画面的品质,就是去提升渲染的画…...
GpuGeek 网络加速:破解 AI 开发中的 “最后一公里” 瓶颈
摘要: 网络延迟在AI开发中常被忽视,却严重影响效率。GpuGeek通过技术创新,提供学术资源访问和跨国数据交互的加速服务,助力开发者突破瓶颈。 目录 一、引言:当算力不再稀缺,网络瓶颈如何破局? …...
关于 Web安全:1. Web 安全基础知识
一、HTTP/HTTPS 协议详解 1. HTTP协议基础 什么是 HTTP? HTTP(HyperText Transfer Protocol)是互联网中浏览器和服务器之间传输数据的协议,基于请求-响应模式。它是一个无状态协议,意思是每次请求都是独立的&#x…...
debugfs:Linux 内核调试的利器
目录 一、什么是 debugfs?二、debugfs 的配置和启用方式2.1 内核配置选项2.2 挂载 debugfs2.3 Android 系统中的 debugfs 三、debugfs 的典型应用场景3.1 调试驱动开发3.2 内核子系统调试3.3 性能分析 四、常见 debugfs 子目录与功能示例4.1 /sys/kernel/debug/trac…...
Spyglass:跨时钟域同步(同步使能)
相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 简介 同步使能方案主要用于数据信号跨时钟域同步,该方案将一个控制信号同步至目标时钟域并用其作为数据信号的捕获触发器的使能信号,如图1所示…...
安装Minikube
环境 CentOS7 参考 minikube start | minikube 创建虚拟机,参考 模拟Gitlab安装-CSDN博客 下载二进制包 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 报错不能解析host,配置host 下载成功 安装 sudo install minikube-linux-am…...
图像锐化调整
一、背景介绍 之前找多尺度做对比度增强时候,发现了一些锐化相关算法,正好本来也要整理锐化,这里就直接顺手对之前做过的锐化大概整理了下,方便后续用的时候直接抓了。 这里整理的锐化主要是两块:一个是参考论文&#…...
【CanMV K230】AI_CUBE1.4
《k230-AI 最近小伙伴有做模型的需求。所以我重新捡起来了。正好把之前没测过的测一下。 这次我们用的是全新版本。AICUBE1.4.dotnet环境9.0 注意AICUBE训练模型对硬件有所要求。最好使用独立显卡。 有小伙伴说集显也可以。emmmm可以试试哈 集显显存2G很勉强了。 我们依然用…...
STM32外设AD-定时器触发 + DMA读取模板
STM32外设AD-定时器触发 DMA读取模板 一,方法思路二,定时器基础与配置1,定时器时钟源 (Clock Source)2,预分频器 (Prescaler - PSC)3,自动重装载寄存器 (Auto-Reload Register - ARR) / 周期 (Period)4,触…...
数据库故障排查指南:从入门到精通
1. 常见数据库故障类型 1.1 连接故障 数据库连接超时连接池耗尽网络连接中断认证失败1.2 性能故障 查询执行缓慢内存使用过高CPU使用率异常磁盘I/O瓶颈1.3 数据故障 数据不一致数据丢失数据损坏事务失败2. 故障排查流程 2.1 初步诊断 -- 检查数据库状态SHOW STATUS;SHOW PRO…...
【AT32】 AT32 移植 Freemodbus 主站
基于野火开发板 at32f437zgt6芯片 和at32 官方开发工具 移植了网上一套开源的freemodbus 主站 这里对modbus 协议不做过多的讲解 主要已实现代码为主 AT32 Work Bench 参考之前我之前的配置 与stm32cubemx软件差不多 注意485芯片的收发脚配置即可 AT32 IDE 说实话这软件太垃…...
内网环境下如何使用ntpdate实时同步时间
背景介绍 NTP(Network Time Protocol)是一种网络协议,用于同步计算机系统的时间。ntpdate是一个用于手动同步时间的命令行工具,它可以从指定的NTP服务器获取当前时间并更新本地系统时间。 ntpdate 服务介绍 功能:ntp…...
python版本管理工具-pyenv轻松切换多个Python版本
在使用python环境开发时,相信肯定被使用版本所烦恼,在用第三方库时依赖兼容的python版本不一样,有没有一个能同时安装多个python并能自由切换的工具呢,那就是pyenv,让你可以轻松切换多个Python 版本。 pyenv是什么 p…...
工商总局可视化模版 – 基于ECharts的大数据可视化HTML源码
概述 在大数据时代,数据可视化已成为各行各业进行数据分析和决策的重要工具。幽络源今天为大家带来一款基于ECharts的工商总局数据可视化HTML模版,帮助开发者快速搭建专业级工商广告数据展示平台。这款模版设计规范,功能完善,适合…...
计算机网络 : 网络基础
计算机网络 : 网络基础 目录 计算机网络 : 网络基础引言1. 网络发展背景2. 初始协议2.1 初始协议2.2 协议分层2.2.1 软件分层的好处2.2.2 OSI七层模型2.2.3 TCP/IP五层(四层)模型 2.3 TCP/IP协议2.3.1TCP/IP协议与操作系统的关系&…...
eSwitch manager 简介
eSwitch manager 的定义和作用 eSwitch manager 通常指的是能够配置和管理 eSwitch(嵌入式交换机)的实体或接口。在 NVIDIA/Mellanox 的网络架构中,Physical Function(PF)在 switchdev 模式下充当 eSwitch manager&am…...
物联网技术在银行安全用电系统中的应用与实践研究
摘要 随着金融科技的快速发展,银行业电子设备数量激增,用电安全管理问题日益突出。本文基于2019年农业银行与2020年中国邮政储蓄银行发布的安全用电相关政策,分析了银行场景下存在的五大用电安全隐患,提出以物联网技术为核心的安…...
589. N叉树的前序遍历迭代法:null指针与栈的巧妙配合
一、题目描述 给定一个N叉树的根节点,返回其节点值的前序遍历结果。前序遍历的定义是:先访问根节点,再依次遍历每个子节点(从左到右)。例如,对于如下N叉树: 1/ | \3 2 4 / \ 5 6前序遍历结果…...
【洗车店专用软件】佳易王洗车店多项目会员管理系统:一卡多用扣次软件系统实操教程 #扣次洗车管理软件
一、软件试用版资源文件下载说明 (一)若您想体验软件功能,可通过以下方式获取软件试用版资源文件: 访问头像主页:进入作者头像主页,找到第一篇文章,点击文章最后的卡片按钮,即可了解…...
小红书笔记详情接口如何调用?实操讲解。
调用小红书笔记详情接口通常需要经过申请权限、构建请求、发送请求并处理响应等步骤,以下是详细的实操讲解: 一、申请接口权限 注册小红书开放平台账号 访问小红书开放平台官网/第三方开放平台,按照提示完成注册流程,提供必要的…...
leetcode 57. Insert Interval
题目描述 代码:由于intervals已经按照左端点排序,并且intervals中的区间全部不重叠,那么可以断定intervals中所有区间的右端点也已经是有序的。先二分查找intervals中第一个其右端点>newInterval左端点的区间。然后按照类似于56. Merge In…...
杰理ac696配置mic
省电容mic有概率不出声解决办法如下...
COMSOL随机参数化表面流体流动模拟
基于粗糙度表面的裂隙流研究对于理解地下水的流动、污染物传输以及与之相关的地质灾害(如滑坡)等方面具有重要意义。本研究通过蒙特卡洛方法生成随机表面形貌,并利用COMSOL Multiphysics对随机参数化表面的微尺度流体流动进行模拟。 参数化…...
Linux远程连接服务
远程连接服务器简介 远程连接服务器通过文字或图形接口方式来远程登录系统,让你在远程终端前登录linux主机以取得可操作主机接口(shell),而登录后的操作感觉就像是坐在系统前面一样。 远程连接服务器的功能 分享主机的运算能力 远…...
用Python绘制梦幻星空
用Python绘制梦幻星空 在这篇教程中,我们将学习如何使用Python创建一个美丽的星空场景。我们将使用Python的图形库Pygame和随机库来创建闪烁的星星、流星和月亮,打造一个动态的夜空效果。 项目概述 我们将实现以下功能: 创建深蓝色的夜…...
EWOMAIL
1、错误 Problem: problem with installed package selinux-policy-targeted-3.14.3-41.el8.noarch package fail2ban-server-1.0.2-3.el8.noarch requires (fail2ban-selinux if selinux-policy-targeted), but none of the providers can be installed - package fail2ban-…...
网安面试经(1)
1.说说IPsec VPN 答:IPsec VPN是利用IPsec协议构建的安全虚拟网络。它通过加密技术,在公共网络中创建加密隧道,确保数据传输的保密性、完整性和真实性。常用于企业分支互联和远程办公,能有效防范数据泄露与篡改,但部署…...
【每天一个知识点】意图传播(Intent Propagation)
在人工智能(AI)快速发展的背景下,自然语言处理(NLP)已成为推动智能系统理解与生成自然语言的核心技术。其中,“意图识别”作为人机交互的关键步骤,已被广泛应用于智能客服、对话系统、语音助手等场景。而“意图传播”(Intent Propagation)作为更深层的机制,逐渐成为当…...
【串流VR手势】Pico 4 Ultra Enterprise 在 SteamVR 企业串流中无法识别手势的问题排查与解决过程(Pico4UE串流手势问题)
写在前面的话 此前(用Pico 4U)接入了MRTK3,现项目落地需要部署,发现串流场景中,Pico4UE的企业串流无法正常识别手势。(一体机方式部署使用无问题) 花了半小时解决,怕忘,…...
工具:shell命令提示符自定义之显示GIT当前分支
1 背景 在命令行操作,每次想查看当前分支都要手动执行命令(git branch)太麻烦了,想着在命令提示符上面显示当前分支,很直观也很方便 2 实现 编辑 vim ~/.bashrc 文件,添加如下内容 function update_prom…...
现代计算机图形学Games101入门笔记(十四)
Irradiance 微小的能量/微小的面积 用Irradiance解释能量大小解释冬夏 Intensity没变,但是Irradiance是衰减的,外圈面积变大,单位面积上接受的能量就变小了。 入射进来 离开 这里就是从某个方向来了一个能量,经过反射,…...
前端开发笔记与实践
一、Vue 开发规范与响应式机制 1. 组件命名规范 自定义组件使用大驼峰命名法(如 MyComponent),符合 Vue 官方推荐,便于与原生 HTML 元素区分。 2. Proxy vs defineProperty 特性Proxy(Vue3)Object.defi…...
机器学习知识自然语言处理入门
一、引言:当文字遇上数学 —— 自然语言的数字化革命 在自然语言处理(NLP)的世界里,计算机要理解人类语言,首先需要将文字转化为数学向量。早期的 One-Hot 编码如同给每个词语分配一个唯一的 “房间号”,例…...