OC foudation框架(上)学习

news2024/11/19 15:26:36

foundation框架

文章目录

  • foundation框架
    • 字符串(NSString && NSMutableString)
      • NSString的其他功能
      • NSMutableString
    • 日期与时间 (NSDate)
      • 2.1 日期与时间(NSDate)
      • 2.2日期格式器
      • 日历与日期组件
      • 定时器(NSTimer)
    • 对象复制
      • copy与mutabCopy方法
      • NSCopying 与 NSMutableCopy 协议
      • 深拷贝与浅拷贝
      • setter方法的复制选项

字符串(NSString && NSMutableString)

功能:

  1. 创建字符串:可以用init也可以string开头的类方法最后是@“”直接给字符串赋值
  2. 读取文件或网络URL初始化
  3. 将字符串的内容写入文件或URL
  4. 获取字符串长度,既可以获取字符串内包括的字符个数,也可以获取字符串包括的字节个数
  5. 连接,分割,查找字串或字符,替换字符,比较字符串,比较字符串大小,大小写转化

下面的代码给出了我们的三种不同的创建方式。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        unichar data[6] = {97, 98, 99, 100, 101, 102};
        NSString* str = [[NSString alloc] initWithCharacters:data length:6];
        NSLog(@"%@", str);
        char* str1 = "Hello world";
        NSString* str2 = [NSString stringWithUTF8String:str1];
        NSLog(@"%@", str2);
        [str2 writeToFile:@"myfile.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
        NSString* str3 = [NSString stringWithContentsOfFile:@"NSString.m"encoding:NSUTF8StringEncoding error:nil];
        NSLog(@"%@", str3);
    }
    return 0;
}

打印结果如下:(这里我们也会同时创建一个文件)

在这里插入图片描述

NSString的其他功能

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString* str = @"hello";
        NSString* book = @"iOS";
        str = [str stringByAppendingString:@"iOS!"];
        NSLog(@"%@", str);
        const char* cstr = [str UTF8String];
        NSLog(@"%s", cstr);
        str = [str stringByAppendingFormat: @"%@是一本不错的书", book];
        NSLog(@"%@", str);
        NSLog(@"个数为%lu", [str length]);
        NSLog(@"按照UTF-8解码后的字节个数为%lu", [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
        NSString* s1 = [str substringToIndex:10];
        NSLog(@"%@", s1);
        NSString* s2 = [str substringFromIndex: 5];
        NSLog(@"%@", s2);
        NSString* s3 = [str substringWithRange: NSMakeRange(5, 10)];
        NSLog(@"%@", s3);
        NSRange pos = [str rangeOfString:@"iOS"];
        NSLog(@"iOS出现的位置%ld, 长度%ld", pos.location, pos.length);
        str = [str uppercaseString];
        NSLog(@"%@", str);
    }
    return 0;
}

上面的代码运用了一个NSRange类型的变量,这个是一个结构体而不是一个类,其包括了包括了location和length两个unsigned int整型值,分别代表起始位置和长度。

结果为:

在这里插入图片描述
在修改字符串的时候,由于NSString字符串不可改变,因此实际上原来的字符串对象并不改变,只是将新生成的字符串重新赋值给原来的指针变量。

str1 = [str1 stringByAppendingString: @“,iOS!”];

NSMutableString

NSString字符串是不可变的字符串,即一旦NSString对象被创建,其中的字符序列就不能更改了。而NSMutableString字符串就不一样了,它的字符串序列是可更改的。而且NSMutableString是NSString的子类,NSString的方法,NSMutableString都可以直接使用。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString* book = @"疯狂iOS讲义";
        NSMutableString* str1 = [NSMutableString stringWithString: @"Hello"];
        [str1 appendString:@"iOS"];
        NSLog(@"%@", str1);
        [str1 appendFormat:@"%@,是一本很不错的书籍", book];
        NSLog(@"%@", str1);
        [str1 insertString:@"fkit.org" atIndex:6];
        NSLog(@"%@", str1);
        [str1 deleteCharactersInRange:NSMakeRange(6, 12)];
        NSLog(@"%@", str1);
        [str1 replaceCharactersInRange:NSMakeRange(6, 12) withString:@"Objective-C"];
        NSLog(@"%@", str1);
    }
    return 0;
}

程序运行结果:

在这里插入图片描述

而在NSMutableString的代码中,由于NSMutableString的字符串是可变的,因此修改字符串的时候,字符串所包含的字符序列本身就发生了改变,因此无需重新赋值。

日期与时间 (NSDate)

2.1 日期与时间(NSDate)

OC提供了NSDate、NSCalendar对象。

其中,NSDate对象代表日期与时间,OC既提供了类方法来创建NSDate对象,也提供了大量init开头的方法来初始化NSDate对象。创建NSDate的类方法和实例方法基本相似,只是类方法以date开头,实例方法以init开头。

#import <Foundation/Foundation.h>
 
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSDate *date1 = [NSDate date]; //获取当前时间
        NSLog(@"%@",date1);
        NSDate *date2 = [[NSDate alloc] initWithTimeIntervalSinceNow:3600 * 24];//获取从当前时间开始的后一天的时间
        NSLog(@"%@",date2);
        NSDate *date3 = [[NSDate alloc] initWithTimeIntervalSinceNow:-3 * 3600 * 24];//获取从现在开始三天前的时间
        NSLog(@"%@",date3);
        NSDate *date4 = [[NSDate alloc] initWithTimeIntervalSince1970:3600 * 24 * 366 * 20];//获取从1970年1月1日开始往后20年的时间
        NSLog(@"%@",date4);
        NSLocale *cn = [NSLocale currentLocale];//NSLocale代表一个语言,这里表示中文
        NSLog(@"%@",[date1 descriptionWithLocale: cn]);//用中文输出date1的时间
        NSDate *earlier = [date1 earlierDate: date2];
        NSLog(@"%@",earlier);//获取两个时间中较早的时间
        NSDate *later = [date1 laterDate: date2];
        NSLog(@"%@",later);//获取两个时间中较晚的时间
        //比较两个日期用:compare:方法,它包括如下三个值
        //三个值分别代表调用compare的日期位于被比较日期之前、相同、之后
        switch([date1 compare: date3]) {
            case NSOrderedAscending: 
            		NSLog(@"date1在date3之前");
                break;
            case NSOrderedSame: 
            		NSLog(@"date1和date3时间想相同");
                break;
            case NSOrderedDescending: 
            		NSLog(@"date1在date3时间之后");
                break;
        }
        NSLog(@"date1和date3的时间差是%g秒",[date1 timeIntervalSinceDate: date3]);//获取两个时间的时间差
        NSLog(@"date2与现在的时间差%g秒",[date2 timeIntervalSinceNow]);//获取指定时间和现在的时间差
    }
    return 0;
}

这里就表现出了创建NSDate的方法,一种是类方法,一种是实例方法,我们重点记忆类方法以date开头,实例方法以init开头这一句话

2.2日期格式器

NSDateFormatter代表一个日期格式器,它的作用就是完成NSDate和NSString之间的转换。在进行转换时,我们首先需要创建一个NSDateFormatter对象,然后调用该对象的setDateStyle:、setTimeStyle:方法设置格式化日期、时间的风格。其中日期、时间风格支持以下几个枚举值:

  • NSDateFormatterNoStyle: 不显示日期,时间的风格
  • NSDateFormatterShortStyle:显示短日期,时间风格。
  • NSDateFormatterMediumStyle:显示中等日期,时间风格。
  • NSDateFormatterLongStyle:显示长日期,时间风格
  • NSDateFormatterFullStyle:显示完整日期,时间风格

如果打算用自己的模版就调用setDateFormate:方法来设置日期,时间的模版

如果需要将NSDate转化为NSString,就是stringFromDate:相反则就是调用dateFromString:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSDate* date = [NSDate dateWithTimeIntervalSince1970:3600 * 24 * 366 * 20];
        NSLocale* locals[] = {[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"], [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]};
        NSDateFormatter* df[8];
        for (int i = 0; i < 2; i++) {
            df[i * 4] = [[NSDateFormatter alloc] init];
            [df[i * 4] setDateStyle: NSDateFormatterShortStyle];
            [df[i * 4] setDateStyle: NSDateFormatterShortStyle];
            [df[i * 4] setLocale: locals[i]];
            df[i * 4 + 1] = [[NSDateFormatter alloc] init];
            [df[i * 4 + 1] setDateStyle: NSDateFormatterMediumStyle];
            [df[i * 4 + 1] setDateStyle: NSDateFormatterMediumStyle];
            [df[i * 4 + 1] setLocale: locals[i]];
            df[i * 4 + 2] = [[NSDateFormatter alloc] init];
            [df[i * 4 + 2] setDateStyle: NSDateFormatterLongStyle];
            [df[i * 4 + 2] setDateStyle: NSDateFormatterLongStyle];
            [df[i * 4 + 2] setLocale: locals[i]];
            df[i * 4 + 3] = [[NSDateFormatter alloc] init];
            [df[i * 4 + 3] setDateStyle: NSDateFormatterFullStyle];
            [df[i * 4 + 3] setDateStyle: NSDateFormatterFullStyle];
            [df[i * 4 + 3] setLocale: locals[i]];
        }
        for (int i = 0; i < 2; i++) {
            switch (i) {
                case 0:
                    NSLog(@"中国各式");
                    break;
                case 1:
                    NSLog(@"美国格式");
                    break;
           

            }
            NSLog(@"SHORT: %@", [df[i * 4] stringFromDate: date]);
            NSLog(@"MEDIUM: %@", [df[i * 4 + 1] stringFromDate: date]);
            NSLog(@"LONG: %@", [df[i * 4 + 2] stringFromDate: date]);
            NSLog(@"FULL: %@", [df[i * 4 + 3] stringFromDate: date]);
        }
        NSDateFormatter* df2 = [[NSDateFormatter alloc] init];
        [df2 setDateFormat:@"公元yyyy年MM月DD日HH时mm分"];
        NSLog(@"%@", [df2 stringFromDate:date]);
        NSString* datestr = @"2013-03-02";
        NSDateFormatter* df3 = [[NSDateFormatter alloc] init];
        [df3 setDateFormat:@"yyyy-MM-dd"];
        NSData* date2 = [df3 dateFromString: datestr];
        NSLog(@"%@", date2);
        
    }
    return 0;
}

在这里插入图片描述

日历与日期组件

为了方便分开处理NSDate所包含的三个数据:年份,月份,日期。OC引入了NSCalendar对象。该方法包含如下两个常用方法:

  • (NSDateComponents*)components:formDate:从NSDate提取年,月,日,时,分,秒各时间字段的信息。
  • dateFromComponents:(NSDateComponents*) comps:使用comps对象包含的年,月,分,秒的各时间字段的信息。

NSDateComponents对象,该对象封装年月日时分秒各时间字段的信息。

我们从NSDate对象中分开获取各时间字段的数值的步骤如下:

  • 创建NSCalendar对象
  • 调用NSCalendar的方法来获取NSDate对象中各时间字段的数值,该方法返回一个NSDateComponents对象。
  • 调用NSDateComponents对象的getter方法。

很容易理解如果我们通过各个时间段的数值来初始化NSDate对象的步骤与上面差别不大,我们只需要把getter方法改成setter方法。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian];
        NSDate* dt = [NSDate date];
        unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday;
        NSDateComponents* comp=[gregorian components: unitFlags fromDate:dt];
        NSLog(@"%ld年", comp.year);
        NSLog(@"%ld月", comp.month);
        NSLog(@"%ld日", comp.day);
        NSLog(@"%ld分", comp.minute);
        NSLog(@"%ld秒", comp.second);
        NSDateComponents* comp2 = [[NSDateComponents alloc] init];
        comp2.year = 2024;
        comp2.month = 5;
        comp2.day = 6;
        comp.hour = 18;
        comp.minute = 34;
        NSDate* date = [gregorian dateFromComponents: comp2];
        NSLog(@"%@", date);
    }
    return 0;
}

这部分是一个从NSDate对象中分开获取各时间字段的数值的方式,以及通过各项数值重新获取到我们的NSDate数据。

在这里插入图片描述

定时器(NSTimer)

当程序需要让某个方法重复执行,可以借助OC中的定时器来完成。

通过调用NSTimer的scheduledTimerWithTimeInterval: invocation: repeats:或scheduledTimerWithTimeInterval: targe:selector: userInfo: repeats:类方法来创建NSTimer对象。调用该方法时需要传入以下参数:

1、timeInterval:指定每隔多少秒执行一次任务

2、invocation或target与selector:指定重复执行的任务。如果指定target和selector参数,则指定用某个对象的特定方法作为重复执行的任务;如果指定invocation参数,该参数需要传入一个NSInvocation对象,该对象也是封装target和selector的,其实也是指定用某个对象的特定方法作为重复执行的任务。

3、userInfo:该参数用于传入额外的附加信息。

4、repeats:该参数需要指定一个BOOL值,该参数控制是否需要重复执行任务。

笔者这里还不会使用,之后会进行一个补充。

对象复制

copy与mutabCopy方法

  • copy方法返回的是对象不可修改的副本,即使该对象本身是可修改的。

  • mutableCopy方法用于复制对象的可变副本。通常来说,mutableCopy方法总是返回该对象可修改的副本,即使被复制的对象本身是不可修改的。

无论如何,copy和mutabCopy返回的总是原对象的副本,当程序对于复制的副本进行修改的时候,原对象通常不会受到影响。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableString* book = [NSMutableString stringWithString:@"疯狂iOS讲义"];
        NSMutableString* bookCopy = [book mutableCopy];
        [bookCopy replaceCharactersInRange:NSMakeRange(2, 3) withString:@"Android"]; // range中第一个是替换的位置,第二个是替换的长度
        NSLog(@"book的值为:%@", book);
        NSLog(@"bookCopy为:%@", bookCopy);
        NSString* str = @"fkit";
        NSMutableString* strCopy = [str mutableCopy];
        [strCopy appendString:@".org"];
        NSLog(@"%@", strCopy);
        NSMutableString* bookCopy2 = [book copy];//程序将返回一个不可修改的副本
      	[bookCopy2 appendString:@"aa"]//这段代码因为我们的bookCopy方法是不可变副本所以会报错。
    }
    return 0;
}

这是上面代码的一个结果:

在这里插入图片描述

tips: 副本的可不可变和他的复制方式有关,而与他的复制对象无关

NSCopying 与 NSMutableCopy 协议

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        FKDog* dog1 = [[FKDog alloc] init];
        dog1.name = [NSMutableString stringWithString:@"旺财"];
        dog1.age = 20;
        FKDog* dog2 = [dog1 copy];
    }
    return 0;
}

这段代码可以通过编译但是却不能够运行,所以我们为了保证一个对象可以调用copy和mutableCopy方法,我们就要通过实现它的NSCopying协议和重写copyWithZone方法。在这里我们调用了allocWithZone因为这个方法可以指定新对象分配内存的位置,如果没有指定分配内存的位置,allocWithZone 方法就会使用默认的分配器来分配内存。

@implementation FKDog
- (id)copyWithZone:(NSZone *)zone {
    NSLog(@"执行copy");
    FKDog* dog = [[[self class] allocWithZone:zone] init];
    dog.name = self.name;
    dog.age = self.age;
    return dog;
}
- (NSString*) description {
    return [NSString stringWithFormat:@"<dog[name = %@, age = %d]>", self.name, self.age];
}
@end

然后我们在主函数增加一条语句:dog2.name = [NSMutableString stringWithString:@"snoopy"];结果为:

在这里插入图片描述

按照我们的一个常理来说,我们的copy方法按照要求是不可以修改的,但是这里却可以修改,这是因为我们没有给我们的FKDog类提供相应的不可变类,如果提供了不可变类,当然还是应该让FKDog的copyWithZone:返回不可变的FKDog对象。

需要指出的是,如果重写copyWithZone:方法时,他的父类也是已经实现了NSCopying协议,并且重写该方法,那么子类重写该方法的时候应该先调用父类的copy方法复制从父类继承的到成员变量,然后对子类中定义的成员变量进行赋值。

- (id) copyWithZone:(NSZone*)zone {
  id obj = [super copy];
  //对子类定义的成员变量赋值
  return obj;
}

深拷贝与浅拷贝

首先我们来看一下我们的代码来帮助我们理解这部分内容。

#import <Foundation/Foundation.h>
#import "FKDog.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        FKDog* dog1 = [[FKDog alloc] init];
        dog1.name = [NSMutableString stringWithString:@"旺财"];
        dog1.age = 20;
        FKDog* dog2 = [dog1 copy];
        NSLog(@"%@", dog1);
        [dog2.name replaceCharactersInRange:NSMakeRange(0, 2) withString:@"anocpy"];
        NSLog(@"%@", dog2);
        NSLog(@"%@", dog1);
    }
    return 0;
}

打印结果如下:

在这里插入图片描述

这里发现我们同时修改了dog1,dog2两个对象的name属性值,这里的主要问题就是在于我们自己写的**copyWithZone:**方法。dog.name = self.name这个语句实际上是将两个指针指向了同一块内存。

在这里插入图片描述

原因是:FKDog的对象的name是一个指针变量,该变量中村方法的只是字符串的地址,而不是字符串本身,所以当我们的对象的实例变量是指针变量时候,如果程序只是赋值该指针的地址,而不是真正复制指针所指向的对象,这种方式就被称为一个“浅拷贝”

请添加图片描述

而深拷贝则不一样,它不仅会复制对象本身,而且会递归的复制每一个指针变量的实例变量,直到两个对象没有任何公用的部分。我们只需要修改一条语句就可以了dog.name = [self.name mutableCopy];dog.name = dog,name两条语句替换就可以实现一个深拷贝

一般来说,深拷贝的实现难度会比较大,所以Foudation框架中的类大部分只实现了浅拷贝。

setter方法的复制选项

在之前的学习中我们学习了copy这个指示符,该指示符就是指定当程序调用setter方法复制时,实际上是将传入的参数的副本赋值给程序的实例变量。

我们实现一个我们的接口部分的代码,用一个copy指示符来定义一个我们的属性。

@interface FKItem : NSObject
@property (nonatomic, copy) NSMutableString* name;
@end

主函数部分:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        FKItem* item = [[FKItem alloc] init];
        item.name = [NSMutableString stringWithString:@"疯狂iOS讲义"];
        [item.name appendString:@"fkit"]; //此处代码会报错。
    }
    return 0;
}

这里我们的代码会报错,但是我们定义的一个接口部分的代码定义的明明是NSMutableString这个可变类型,但是为什么我们会出现无法复制的原因是我们的setName方法的缘故。

- (void) setName: (NSMutableString*) aname {
  name = [aname copy];
}

这个部分我们的copy方法默认是复制该对象的不可变副本,虽然设置的是一个NSMutableString但是实际上我们得到的却是不可变字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1663831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文献速递:多模态深度学习在医疗中的应用--多模态深度学习用于阿尔茨海默病痴呆评估

Title 题目 Multimodal deep learning for Alzheimer’s disease dementia assessment 多模态深度学习用于阿尔茨海默病痴呆评估 01 文献速递介绍 全球每年新发痴呆症病例近1000万例&#xff0c;其中阿尔茨海默病&#xff08;AD&#xff09;最为常见。需要新的措施来改善因…

Linux(centos7)系统配置 ntpd服务设置时间同步

一 、应用场景 两台服务器,要求使他们时间同步,有人问为什么要时间同步?如果一个集群中,时间相差很大,那么会出现很多诡异的问题,你也不想在一个无法解决的问题上浪费几天时间吧!总之,设置服务器之间时间同步,为了避免很多问题的发生! ntpd(Network Time Protocol …

【ZYNQ】Vivado 封装自定义 IP

在 FPGA 开发设计中&#xff0c;IP 核的使用通常是不可缺少的。FPGA IP 核是指一些已经过验证的、可重用的模块或者组件&#xff0c;可以帮助构建更加复杂的系统。本文主要介绍如何使用 Vivado 创建与封装用户自定义 IP 核&#xff0c;并使用创建的 IP 核进行串口回环测试。 目…

[开发|安卓] Android Studio 开发环境配置

Android Studio下载 Android Studio下载地址 下载SDK依赖 1.点击左上角菜单 2.选择工具 3.打开SDK管理中心 4.下载项目目标Android版本的SDK 配置安卓虚拟机 1.打开右上角的设备管理 2.选择合适的手机规格 3.下载并选择项目目标Android系统 4.点击完成配置 …

SpringBoot 3.2.5 + ElasticSearch 8.12.0 - SpringData 开发指南

目录 一、SpringData ElasticSearch 1.1、环境配置 1.2、创建实体类 1.3、ElasticSearchTemplate 的使用 1.3.1、创建索引库&#xff0c;设置映射 1.3.2、创建索引映射注意事项 1.3.3、简单的 CRUD 1.3.4、三种构建搜索条件的方式 1.3.5、NativeQuery 搜索实战 1.3.6…

使用socat做端口转发

最近买的云上mongo数据库但是数据库不支持外网访问&#xff0c;准备做iptables转发但是一直不成功&#xff0c;腾讯云官方给予的解释是受服务器内启动的docker影响 做iptables转发会冲突&#xff0c;所以只能另想办法&#xff0c;我发现使用socat做转发也很好用&#xff0c;所以…

01.基本概念

操作系统 为什么要有操作系统&#xff1f; 计算机时一个十分复杂的系统&#xff0c;又cpu、内存、磁盘、IO设备、网络接口等等复杂的硬件组成&#xff0c;人的精力是有限的&#xff0c;不可能了解所有的硬件接口&#xff0c;但是程序可以。 所以我们在计算机上安装了一层软件&…

网易云新玩法:教你赚取第一桶金!

在现今的音乐应用市场中&#xff0c;有几款软件备受广大用户的青睐。 其中&#xff0c;QQ音乐、酷狗音乐以及网易云音乐都是大家耳熟能详的名字。 这些平台不仅提供了丰富的音乐资源&#xff0c;还具备了许多便捷的功能&#xff0c;使得用户们能够享受到更为优质的音乐体验。…

五一 大项目

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…

linux安装配置Docker保姆级教程

Docker到底是什么? Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机制&#xff0c;相互之间…

【MySQL的内置函数】

文章目录 一、日期函数1.current_date()2.current_time()3.current_timestamp4. date_add 穿越未来5.date_sub 回到过去6.datediff案例 二、字符串函数2.1charset2.2 concat ——拼接字符串2.3 ucase——转化成大写2.4 lcase——转化成小写2.5 left&#xff08;&#xff09;2.6…

vue3 element plus el-date-picker组件在日期上做标识

1.先看效果图,带红点的就是我要做标识的日期 2.直接把代码拿出来就可以用 (1)html部分 <el-date-pickerv-model"startTime"type"datetime"placeholder"选择开始日期"format"YYYY-MM-DD HH:mm"value-format"YYYY-MM-DD HH:mm…

测试新人常问:如何开始自动化测试,必须知道的10点!

随着互联网技术的发展&#xff0c;无论哪个公司&#xff0c;哪个团队都在谈论自动化测试、动手实现自动化测试&#xff0c;从而让测试显得更加“高大上”。 那么是不是所有的业务都适合自动化&#xff1f;是不是自动化做的越多&#xff0c;效果越好呢&#xff1f;下面就自己一…

物联网平台之单体架构

介绍本文主要介绍平台的单体架构&#xff0c;包括各个组件之间的数据流描述以及所做的一些架构选择。在单体架构模式下&#xff0c;所有 ThingsKit 组件都在单个 Java 虚拟机 (JVM) 中启动&#xff0c;并共享相同的操作系统资源。由于 ThingsKit 是用 Java 编写的&#xff0c;因…

企业大文件传输之安全数据传输的重要性

企业数据安全性的维护直接关系到企业的市场竞争力乃至其生存的根基。数据的保护不仅涉及到保护企业的商业秘密&#xff0c;也关乎到客户隐私的保护&#xff0c;更触及到国家安全的敏感层面。因此&#xff0c;保障数据在传输过程中的安全&#xff0c;成为了每个企业和组织必须面…

【湿地探秘】守护蓝色星球的绿色之肾

在地球的广阔画卷中&#xff0c;湿地犹如镶嵌其中的翡翠&#xff0c;不仅孕育着丰富的生物多样性&#xff0c;更是自然界不可或缺的调节器。今天&#xff0c;让我们一同深入了解湿地的基本概念、我国湿地的概貌、湿地的多样类型&#xff0c;以及保护湿地对于人类和地球的深远意…

2024.5.8 关于 SpringCloud —— Ribbon 的基本认知

目录 Ribbon 负载均衡原理 工作流程 Ribbon 负载均衡规则 Ribbon 负载均衡自定义化 代码方式修改规则 配置文件方式修改规则 小总结 Ribbon 设定饥饿加载 Ribbon 负载均衡原理 工作流程 order-service 使用 RestTemplate 发送请求&#xff0c;随后该请求将会被 Ribbon 所…

探针流量检测与回溯分析,解密AnaTraf网络流量分析仪的神奇魅力

目录 导言 概述 流量检测探针 流量回溯分析 网络故障解决案例 了解更多 导言 在当今互联网时代&#xff0c;网络性能监测与诊断成为企业发展的关键。为了解决网络故障和提升网络性能&#xff0c;AnaTraf网络流量分析仪应运而生。本文将详细介绍AnaTraf的功能和优势&#…

Python 框架安全:SSTI 模板注入漏洞测试.

什么是 SSTI 模板注入 SSTI (Server-Side Template Injection) 是一种Web应用程序安全漏洞&#xff0c;它发生在应用程序使用模板引擎渲染用户输入时。当应用程序将用户输入直接插入到模板中而不进行充分的过滤和验证时&#xff0c;就可能导致SSTI漏洞。攻击者可以利用这个漏洞…

制造业数字化转型解决方案及应用(125页PPT)

一、资料介绍 《制造业数字化转型解决方案及应用》是一份内容丰富、深入剖析制造业数字化转型的125页PPT资料。这份资料以“智能制造、制造业数字化转型、制造业数字化转型案例”为关键词&#xff0c;全面展现了制造业数字化转型的核心理念、解决方案以及实际应用案例。 关注…