【iOS】《Effective Objective-C 2.0》阅读笔记(一)
文章目录
- 前言
- 了解OC语言的起源
- 在类的头文件中尽量少引入其他头文件
- 多用字面量语法,少用与之等价的方法
- 字面量数值
- 字面量数组
- 字面量字典
- 多用类型常量,少用#define预处理指令
- 用枚举法表示状态、选项、状态码
- 总结
前言
最近开始阅读一些iOS开发的相关书籍,第一本就是《Effective Objective-C 2.0》,这里对第一周的阅读内容进行简单归纳和总结,主要是熟悉OC语言。
了解OC语言的起源
OC语言由Smalltalk演化而来,其使用“消息结构”而非“函数调用”。
Smalltalk 起源于 20 世纪 70 年代的施乐帕洛阿尔托研究中心(Xerox PARC)。它是在当时计算机科学研究蓬勃发展的背景下诞生的,是面向对象编程(OOP)领域的先驱语言。
早期的 Smalltalk 主要用于研究和实验先进的编程概念。图构建一种能够模拟人类认知和交互方式的编程语言。例如,在当时传统的编程语言以过程式编程为主流时,Smalltalk 独树一帜地强调对象之间的消息传递。
对象是核心
在 Smalltalk 中,所有的实体都是对象。无论是简单的数据类型,如整数、字符、布尔值,还是复杂的用户自定义的数据结构,都被视为对象。例如,一个简单的整数对象 “5”,它不仅包含了数值本身,还包含了一系列可以对这个数值进行操作的方法。这些方法以消息传递的方式被调用,就好像这个整数对象能够 “理解” 并执行某些指令一样。
这种对象的概念是非常彻底的。以字符串对象为例,一个字符串对象可以接收诸如 “长度计算”“字符提取”“拼接其他字符串” 等消息,通过这些消息的传递来实现对字符串的各种操作。
消息传递机制
消息传递是 Smalltalk 中对象之间交互的主要方式。当一个对象需要另一个对象执行某个操作时,它会向对方发送一个消息。例如,假设有一个表示图形的对象和一个表示绘图工具的对象。图形对象可能会向绘图工具对象发送一个 “绘制我” 的消息,绘图工具对象收到消息后,会根据图形对象的属性(如形状、颜色等)来执行绘制操作。
消息可以带参数,也可以不带参数。比如,一个数字对象向另一个数字对象发送 “加法” 消息时,会带上要相加的数值作为参数。这种机制类似于人类之间的交流,一个对象 “请求” 另一个对象做某事,使得代码的逻辑更加符合自然的思维方式。
类与继承
类是创建对象的模板。在 Smalltalk 中,类定义了对象的属性和行为。例如,定义一个 “动物” 类,它可能包含 “名称”“年龄” 等属性,以及 “移动”“发出声音” 等行为(通过方法定义)。
继承是 Smalltalk 中实现代码复用和层次化设计的重要手段。例如,定义一个 “哺乳动物” 类继承自 “动物” 类,“哺乳动物” 类可以继承 “动物” 类的所有属性和行为,同时还可以添加自己特有的属性和行为,如 “喂奶” 等行为。这使得代码的组织结构更加清晰,符合现实世界中生物分类的逻辑。
对于消息和函数调用的区别,可以通过如下代码来体现:
//Messaging(OC)——"消息结构"
Object *obj = [Object new];
[obj performWith:parameter1 and:parameter2];//Function calling(C++)——“函数调用“
Object *obj = new Object;
obj->perform(parameter1, parameter2);
消息结构和函数调用的关键差别在于:使用消息结构的语言,其运行所应执行的代码由运行环境来决定;而使用函数调用的语言,则由编译器决定。
OC的重要工作都由“运行期组建”而非编译器来完成。OC是C的“超集”,所以C语言中的所有功能在编写OC时仍然适用 。
OC语言中的指针是用来指示对象的。想要声明一个变量。令其指代某个对象,可用如下语法:
NSString *someString = @"The string";
上述代码声明了一个名为someString的变量,其类型为NSString*,即此变量为指向NSString的指针。所有的OC语言的对象声明必须以指针的形式,因为对象所占内存总是分配在“堆空间(heap space)”中,而绝不会在“栈(stack)”上。
someString变量指向分配在堆里的某块内存,其中含有一个NSString对象,若再创建一个变量,令其指向同一地址,如下:
NSString *someString = @"The string";
NSString *anotherString = someString;
则并不会拷贝该对象,只是两个变量同时指向一个对象。即只有一个NSString实例,但有两个变量指向此实例,两个变量都是NSString类型。如图:
但是,在OC中有时会遇到定义里不带有的变量,它们可能使用到“栈空间”,这些变量保存的不是CO对象。例如:
CGRect frame;
frame.origin.x = 0.0f;
frame.origin.y = 10.0f;
frame.size.width = 100.0f;
frame.size.height = 150.0f;.
小结
- OC为C语言添加了面向对象特征,是其的超集。OC使用动态绑定的消息结构,即在运行时才会检查对象类型。接受一条消息后,究竟应执行什么代码,有运行环境而非编译器来决定。
- 理解C语言的核心概念有助于写好OC程序。尤其要掌握内存模型和指针。
在类的头文件中尽量少引入其他头文件
假设我们有两个类。Person类可能会拥有一些Book类的对象,作为他所拥有的藏书。
Book.h头文件:
#import <Foundation/Foundation.h>@interface Book : NSObject
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *author;@end
在Person.h头文件中,假设我们只是想声明一个Book的指针作为成员变量(表示这个人拥有的一本书),我们如果如下在Person.h文件中直接引入Book.h文件,就在两者之间建立了一种依赖关系。
如果过多地引入头文件,会导致代码的耦合性增加,还可能引入许多根本用不到的内容,会增加代码的编译时间和维护成本。
耦合性是指不同模块(在这里可以理解为不同的类)之间相互依赖的程度。例如,如果类 A 的头文件中引入了许多其他类的头文件,那么当这些被引入头文件中的类发生变化(如修改了成员变量或者方法签名)时,类 A 可能也需要进行相应的修改,这就增加了维护成本。
Person.h头文件:
#import <Foundation/Foundation.h>
#import "Book.h"@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) Book *favoriteBook;@end
为了避免上述情况,在Person.h头文件中,如果我们只是想声明一个Book的指针作为成员变量(表示这个人拥有的一本书),我们可以使用向前声明来避免引入Book.h头文件,如下:
Person.h头文件:
#import <Foundation/Foundation.h>
@class Book;@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) Book *favoriteBook;@end
然后在Person.m实现文件中,当我们需要真正使用Book类的完整定义(例如访问Book的属性或者调用Book的方法)时,再引入Book.h头文件:
Person.m文件:
#import "Person.h"
#import "Book.h"@implementation Person
// 这里可以使用Book类的完整定义来实现Person类的方法
// 比如设置favoriteBook的属性等操作
@end
向前引用:
- 解决了头文件循环引用的问题
在复杂的代码结构中,尤其是涉及多个类或模块相互关联时,很容易出现头文件循环包含的情况。例如,类 A 的定义可能依赖于类 B 的部分信息,而类 B 的定义又依赖于类 A 的部分信息。如果直接使用头文件包含的方式,编译器会陷入无限循环地处理这些相互包含的头文件,造成循环引用。虽然我们使用#import而非#include不会导致死循环,但是这意味着两个类中有一个类无法被正确编译。
- 但当涉及协议(Protocol)相关操作时,进行向前声明就无法满足需求了。在 Objective - C 中,当一个类声明遵循某个协议(Protocol)时,编译器需要知道协议的完整定义来检查该类是否正确地实现了协议中的方法。这时就必须要引入头文件,而不能使用向前声明了。
小结
- 除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前声明来提及别的类(使用@class),并在实现文件中引入那些类的头文件(使用import)。这样做可以尽量降低类之间的耦合。
- 有时无法使用向前声明,比如要声明某个类遵循一项协议。这种情况下,尽量把“该类遵循某协议”的这条声明移至分类中。如果不行的话,就把协议单独放在一个头文件中,然后将其引入。
多用字面量语法,少用与之等价的方法
//字面量语法
NSString *someString = @"Effective Objective-C";
//与之等价的创建方法
NSString *someString = [[NSString alloc] initWithString:@"Effective Objective-C"];
字面量数值
//字面数值
NSNumber *someNumber = @1;
//与之等价的数值创建方法
NSNumber *someNumber = [NSNumber numberWithInt:1];
能够以NSNumber实例表示的所有数据都可以使用该语法:
NSNumber *intNumber = @1;
NSNumber *floatNumber = @2.5f;
NSNumber *doubleNumber = @3.14159;
NSNumber *boolNumber = @YES;
NSNumber *charNumber = @'a';//字面量语法对于以下表达式也适用
int x = 5;
float y = 6.32f;
NSNumber *expressionnumber = @(x * y);
字面量数组
//字面量语法
NSArray *animals = @[@"cat", @"dog", @"mouse", @"badger"];
NSString *dog = animals[1];
//与之等价的方法
NSArray *animals = [NSArray arrayWithObjects:@"cat", @"dog", @"mouse", @"badger", nil];
NSString *dog = [animals objectAtIndex:1];
但当你使用字面量语法创建数组时,数组元素对象中不能有nil,否则会报错。
因为在 Objective - C 中,使用字面量语法创建NSArray时,nil是一个特殊的值,它用于表示数组元素的结束标记,不能作为一个普通元素放在数组中间或者末尾。如果像这样把nil当作普通元素添加进去,会导致运行时错误,程序很可能会崩溃。因为系统在解析这个字面量创建的数组时,一旦遇到nil就会认为数组元素已经结束了,后面的内容不会再被当作数组元素处理了。在使用字面量语法创建字典时同理。
字面量字典
//字面量语法创建字典
NSDictionary *myDictionary = @{@"key1" : @"value1", @"key2" : @"value2", @"key3" : @"value3"};
//与之等价的方法
NSArray *keys = @[@"key1", @[@"key2", @"key3"]];
NSArray *objects = @[@"value1", @"value2", @"value3"];
NSDictionary *myDictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
}
字面量语法的局限性:
字面量语法除字符串之外,所创建出来的对象必须属于Foundation框架才行。如果定义了这些类的子类,就无法使用字面量语法创建其对象。字面量通常只能用于特定的数据类型,比如数组和字典。不能使用字面量语法来创建自定义类的实例。
小结
- 应该使用字面量语法来创建字符串、数值、数组、字典。与创建此类对象的常规方法相比,这么做更加简明扼要。
- 应该通过取下标操作来访问数组下标或字典中的键所对应的元素。
- 用字面量语法创建数组或字典时,若值中有nil,则会抛出异常。因此,务必确保值里不含nil。
多用类型常量,少用#define预处理指令
定义常量的命名
#define MAX_NUMBER 22
在实际的开发里面,这样定义出来的常量没有类型信息,并且假设此命令在某个头文件中,那么所有引入了这个头文件的的代码,其定义的固定值都会被这个替换掉。
类型常量的方法:
static const NSInteger kNumber = 22;
定义常量的位置方法
定义常量的位置是极其重要的,我们总喜欢在头文件里声明预处理指令,那么引入了这个头文件的所有文件都会含有这个变量,万一重名,程序变得异常麻烦。所以最好不要在头文件中定义常量,不论你是如何定义常量的,因为OC中没有“名称空间”这一概念。
因此我们最好在头文件中声明常量,在实现文件中定义常量
小结
- 不要用预处理指令定义常量。这样定义出来的常量不含类型信息,编译器只是会在编译前据此执行查找与替换操作。即使有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中的常量值不一致。
- 在实现文件中使用static const来定义“只在编译单元内可见的常量”(translation-unit-specificconstant)。由于此类常量不在全局符号表中,所以无须为其名称加前缀。
- 在头文件中使用extern来声明全局常量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称应加以区隔,通常用与之相关的类名做前缀。
用枚举法表示状态、选项、状态码
- 应该用枚举来表示状态机的状态、传递给方法的选项以及状态码等值,给这些值起个易懂的名字。
- 如果把传递给某个方法的选项表示为枚举类型,而多个选项又可同时使用,那么就将各选项值定义为2的幂,以便通过按位或操作将其组合起来。
- 用NS_ENUM与NS_OPTIONS宏来定义枚举类型,并指明其底层数据类型。这样做可以确保枚举是用开发者所选的底层数据类型实现出来的,而不会采用编译器所选的类型。
- 在处理枚举类型的switch语句中不要实现default分支。这样的话,加入新枚举之后,编译器就会提示开发者:switch语句并未处理所有枚举。
总结
从本周开始,笔者开始阅读Effective Objective-C 2.0,本周了解到OC的起源和部分代码编写时的优化,发现自己之前代码有很多不足,后续还会继续阅读这本书。
相关文章:
【iOS】《Effective Objective-C 2.0》阅读笔记(一)
文章目录 前言了解OC语言的起源在类的头文件中尽量少引入其他头文件多用字面量语法,少用与之等价的方法字面量数值字面量数组字面量字典 多用类型常量,少用#define预处理指令用枚举法表示状态、选项、状态码 总结 前言 最近开始阅读一些iOS开发的相关书籍…...
LVS 负载均衡面试题及参考答案
目录 什么是 LVS 负载均衡?它的主要作用是什么? 为什么要使用 LVS 进行负载均衡? LVS 有哪些组成部分? 简述 LVS 的架构。 LVS 中有哪两种典型的架构?请简要说明它们的特点。 LVS 的工作原理是怎样的?简述 LVS 的工作原理。 解释 LVS 中的虚拟服务器(VS)概念。 …...
北京科博会 天云数据CEO雷涛谈人工智能技术服务数字资产建设
7月13日,第二十六届中国北京国际科技产业博览会(简称北京科博会)在国家会议中心开幕。本届科博会年度主题为“实施创新驱动发展战略 增强高质量发展动能”。会上,天云数据CEO雷涛发表《人工智能技术服务数字资产建设》主题演讲。 近期非常引人注目的事件…...
【Python运维】容器管理新手入门:使用Python的docker-py库实现Docker容器管理与监控
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着容器技术的广泛应用,Docker已经成为开发和运维中的标准工具之一。使用Python语言管理Docker容器,不仅可以自动化繁琐的容器操作,还能…...
小程序解决大问题-物流系统磁盘爆满问题处理
晚上七点,煤矿调运的物流调度系统突然磁盘报名导致服务崩溃。系统用的是微服务,没有详细操作说明,也不敢动,运煤车辆排起了长队,只能联系厂家处理。好在经过30多分钟的处理,服务终于启动,系统运…...
计算机网络基础篇
TCP/IP网络模型 TCP/IP网络模型的作用就是给数据包进行层层封装,帮助数据包能够正确的找到对应的设备接受数据。 一个URL所经历的全部过程 URL所经历的全部过程: HTTP -> DNS ->协议栈-TCP->IP->MAC->网卡->交换机->路由器->服…...
32 从前序与中序遍历序列构造二叉树
32 从前序与中序遍历序列构造二叉树 32.1 从前序与中序遍历序列构造二叉树解决方案 class Solution { public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {return buildTreeHelper(preorder, inorder, 0, 0, inorder.size() - 1)…...
D82【python 接口自动化学习】- pytest基础用法
day82 pytest初体验 学习日期:20241128 学习目标:pytest基础用法 -- pytest初体验 学习笔记: 文件命名规范 py测试文件必须以test_开头(或_test结尾)测试方法必须以test开头测试类必须以Test开头,并且…...
在开发环境中,前端(手机端),后端(电脑端),那么应该如何设置iisExpress
首先,要想手机端应用能成功请求后端,两个设备至少需在同一个局域网内,且IP地址互通; 因为ajax是http(s)://IP地址端口号的方式请求,但是iisExpress默认是localhost如何解决,并没有IP地址,所以手…...
磁盘/系统空间占满导致黑屏死机无法开机的解决办法
文章目录 起因具体操作1.重启虚拟机,一直按CtrlShitf进入GRUP界面2.选“Ubuntu高级选项”并回车选择第二个,recovery mode![请添加图片描述](https://i-blog.csdnimg.cn/direct/201f9784c203406d802d24b39dc2d4a3.png)3.4.命令查看磁盘情况5.查找和删除文…...
使用zabbix监控k8s
一、 参考文献 小阿轩yx-案例:Zabbix监控kubernetes云原生环境 手把手教你实现zabbix对Kubernetes的监控 二、部署经验 关于zabbix监控k8s,总体来说是分为两块内容,一是在k8s集群部署zabbix-agent和zabbix- proxy。二是在zabbix进行配置。…...
MacOS安装MySQL数据库和Java环境以及Navicat
安装MySQL 去官网下载:MySQL 下载好后安装,在设置里往下滑,出现了这样,就代表安装成功了 接下来配置环境: 首先在我们的设备上找到终端并打开,输入 vim ~/.bash_profile(注意vim后面的空格),输入完成后点击…...
算法的复杂度
1.数据结构前言 下面的概念有的比较难理解,做个了结就行。 1.1数据结构的起源 在现实生活中我们更多地并不是解决数值计算的问题,而是 需要一些更科学的手段如(表,数,图等数据结构),才能更好…...
Linux命令进阶·如何切换root以及回退、sudo命令、用户/用户组管理,以及解决创建用户不显示问题和Ubuntu不显示用户名只显示“$“符号问题
目录 1. root用户(超级管理员) 1.1 用于账户切换的系统命令——su 1.2 退回上一个用户命令——exit 1.3 普通命令临时授权root身份执行——sudo 1.3.1 为普通用户配置sudo认证 2. 用户/用户组管理 2.1 用户组管理 2.2 用户管理 2.2.1 …...
若依项目源码阅读
源码阅读 前端代码分析 代码生成器生成的前端代码有两个,分别是course.js用于向后端发送ajax请求的接口代码,另一个是index.vue,用于在浏览器展示课程管理的视图组件。前端的代码是基于vue3elementplus。 template用于展示前端组件别的标签…...
JVM知识点学习-1
学习视频:狂神说Java 类加载器和双亲委派机制 类加载器 作用:加载Class文件 流程:这里的名字car1。。在栈里面,但是数据在堆里面 类加载器的几个类型: 虚拟机自带的类加载器;启动类(根Boot…...
TypeScript和JavaScript区别详解
文章目录 TypeScript和JavaScript区别详解一、引言二、类型系统1、静态类型检查TypeScript 示例JavaScript 示例 2、类型推断TypeScript 示例JavaScript 示例 三、面向对象编程TypeScript 示例JavaScript 示例 四、使用示例1. 环境搭建2. 创建TypeScript项目3. 安装TypeScript插…...
RVO动态避障技术方案介绍
原文:RVO动态避障技术方案介绍 - 哔哩哔哩 我们在开发游戏的时候经常会遇到这样的问题,当我们寻路的时候,其它人也在寻路,如何避免不从其它人的位置穿过。这个叫做动态避障,目前主流的解决方案就是RVO。本节我们来介绍…...
Vue进阶之单组件开发与组件通信
书接上篇,我们了解了如何快速创建一个脚手架,现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时,要在新建文件夹中打开终端创建一个基本的脚手架,可在脚手架中原有的文件中修改或在相应路径重新创建…...
OGRE 3D----5. OGRE和QML事件交互
在现代图形应用程序开发中,OGRE(Object-Oriented Graphics Rendering Engine)作为一个高性能的3D渲染引擎,广泛应用于游戏开发、虚拟现实和仿真等领域。而QML(Qt Modeling Language)则是Qt框架中的一种声明式语言,专注于设计用户界面。将OGRE与QML结合,可以充分利用OGR…...
ARIMA-神经网络混合模型在时间序列预测中的应用
ARIMA-神经网络混合模型在时间序列预测中的应用 1. 引言 1.1 研究背景与意义 时间序列预测在现代数据科学中扮演着越来越重要的角色。从金融市场的价格走势到工业生产的需求预测,从气象数据的天气预报到用电量的负荷预测,时间序列分析无处不在。传统的统计方法和现代深度学习…...
常见靶场的搭建
漏洞靶场 渗透测试(漏洞挖掘)切忌纸上谈兵,学习渗透测试(漏洞挖掘)知识的过程中,我们通常需要一个包含漏洞的测试环境来进行训练。而在非授权情况下,对于网站进行渗透测试攻击,是触及…...
[MacOS] [kubernetes] MacOS玩转虚拟化最佳实践
❓ 为什么不在MacOS本机安装呢?因为M系列芯片是Arm架构,与生产环境或者在本地调试时候,安装虚拟镜像和X86不同,造成不必要的切换环境的额外成本,所以在虚拟化的x86调试 步骤 & 详情 一: 安装OrbStack & 并配置…...
HarmonyOS:@Provide装饰器和@Consume装饰器:与后代组件双向同步
一、前言 Provide和Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,Provide和Consume摆脱参数传递机制的束缚,实现跨层级传递。 其中Provi…...
git 上传代码时报错
在上传代码时,显示无法上传 PS E:\JavaWeb\vue3-project> git push To https://gitee.com/evening-breeze-2003/vue3.git! [rejected] master -> master (non-fast-forward) error: failed to push some refs to https://gitee.com/evening-breeze-20…...
判断1456789876541是否为素数,是输出“是素数“,不是则输出“不是素数“
题目描述 判断1456789876541是否为素数,是输出"是素数",不是则输出"不是素数" 代码实现 int main() { long long n 1456789876541; //for (long long i 2; i < n; i)//数据量太大 for(long long i2;i<sqrt(n);i)//素数的优化 { if (n % i 0) …...
Flutter:封装发送验证码组件,注册页使用获取验证码并传递控制器和验证码类型
验证码:view import package:flutter/material.dart; import package:get/get.dart; import index.dart;class SendcodePage extends GetView<SendcodeController> {// 接收注册页面,传进来的手机号控制器,和发送验证码的类型final Tex…...
亚马逊IP关联是什么?
亚马逊不仅提供了广泛的商品和服务,也是许多企业和个人选择的电子商务平台。然而,与亚马逊相关的IP关联问题,特别是在网络安全和运营管理方面,经常成为使用亚马逊服务的用户和商家关注的焦点。通过了解亚马逊IP关联的含义、可能的…...
Electron + vue3 打包之后不能跳转路由
路由不跳转问题原因: 是因为electron需要将vue-router的mode调整为hash模式(两种写法) export default new Router({mode: hash, //这里history修改为hashscrollBehavior: () > ({y: 0}),routes: constantRouterMap, }) export default new createRouter({his…...
docker安装clickhouse副本集群
docker安装clickhouse副本集群 1、clickhouse副本集群搭建1.1、docker安装zookeeper集群1.1.1、zookeeper第一个节点安装1.1.2、zookeeper第二个节点安装1.1.3、zookeeper第三个节点安装1.1.4、zookeeper客户端命令 2、Clickhouse副本集群搭建2.1、clickhouse搭建2.2、验证集群…...
wordpress 4.5 汉化主题/买链接官网
创建CA证书,用于生成客户端服务端证书. keytool -genkey -alias root -keyalg RSA -keystore root.jks生成客户端证书 keytool -export -alias -file client.cer -keystore root.jks生成服务端证书. keytool -export -alias -file server.cer -keystore root.jks秘钥库,彼此签发…...
建设部门的网站/宁德市人民政府
在文章http://blog.csdn.net/u013063153/article/details/73611549写到了非HA集群的搭建。 现利用Zookeeper做HA,搭建HDFS集群。需要修改之前的配置。 1.进入etc/hadoop/目录,干掉masters文件(此文件是存放Secondary NameNode的) cd etc/hadoop/ rm …...
综合门户网站源码/百度推广开户联系方式
1. 写NetworkWordCount 的java代码 2. window系统需要下载netcat,并安装,相关安装文档; windows安装netcat的方法如下: (1)把下载好的Netcat文件夹内所有文件剪切至C盘下的system32文件夹内。(2…...
建设部网站危房鉴定标准规定/免费网站模板网
时间同步: 首先需了解linux内一任务计划工具crontabcrontab可以定时去执行你要做的动作直接用crontab命令编辑crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数crontab -l //列出某个用户cron服务的详细内容crontab -r //删除某个用…...
wordpress foxpay/阿里指数在线查询
转载于:https://www.cnblogs.com/zjy850984598/p/10763371.html...
网页设计与网站建设作品/电子商务seo实训总结
package cn.kgc;import java.util.Scanner;/*** 吃货联盟订餐管理系统****/public class Chlm2 {public static void main(String[] args) {// 数据主体:一组订单信息String[] names new String[4]; // 订餐人名称String[] dishMegs new String[4]; // 所选菜品in…...