- 博客(87)
- 收藏
- 关注
原创 OC:load、init与initialize
区别: + (void) load + (void) initialize - (id) init 执行时机 在程序运行后立即执行 在类的第一个方法第一次被调用 (即类接收到消息) 之前执行,同一个类只会执行一次,与对象个数的多少无关 在对象实例化时调用,如 [[NSObject alloc] init],每实例化一个对象就会调用一次, 若自身未定义,是否沿用父类方法 否 是 是 类别中的定义 全都执行,但主类优先于分类加载 .
2021-03-03 01:06:17
538
原创 iOS:自定义导航栏BarButtonItem的大小
开发时遇到的问题:需要设置导航栏的rightBarButtonItem的大小和背景颜色,常规用法是直接使用UIButton传给initWithCustomView进行使用,但是此时自定义的button的frame是不受控制的,修改frame并不会起作用。解决方法:用UIView作为CustomView传入,然后修改frame,这时view的大小就可以自定义了。代码如下:UIView *containerView = [UIView new];containerView.frame = CGR
2021-01-11 22:24:09
1180
原创 iOS代码规范:类的布局
#pragma mark - Life Cycle Methods- (instancetype)init- (void)dealloc- (void)viewWillAppear:(BOOL)animated- (void)viewDidAppear:(BOOL)animated- (void)viewWillDisappear:(BOOL)animated- (void)viewDidDisappear:(BOOL)animated#pragma mark - Override Me.
2021-01-10 21:24:51
224
原创 为什么要用HTTP而不直接用TCP
一句话概括:HTTP连接 =以HTTP协议为通信协议的TCP连接 TCP/IP协议可以两个进程通过三次握手建立稳定的通信信道,发送字节流;而HTTP协议建立在TCP/IP协议之上,也就是说TCP/IP协议可以让两个程序说话,而HTTP协议定义了说话的规则。举个栗子: A想要B左边口袋的糖,A和B通过TCP进行连接后,A发给B:我想要你左边口袋的糖,此时进程B如果没和A做过任何约定,那么可能就无法理解这句话; 如果A和B提前做好了约定:你发给我的...
2020-07-31 11:21:10
4829
原创 Redis:RDB持久化
一、Redis持久化:1.持久化的原因Redis 是一个内存数据库,即Redis的读写都在内存中,所以它的读写效率较高,但在内存中的数据会随着服务器的断电或者宕机而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便 Redis 重启时能够从磁盘中恢复原有的数据,而整个过程就叫做 Redis 持久化。 Redis 持久化也是 Redis和 Memcached 的主要区别之一,因为 Memcached是不具备持久化功能的。 ...
2020-07-29 16:11:36
212
原创 同步异步与阻塞非阻塞
同步异步,阻塞非阻塞他们针对的对象是不一样的。对于调用者来说是阻塞跟非阻塞,被调用者是同步跟异步。同步通信和异步通信:同步:由调用者主动等待这个被调用者返回的结果。 异步:调用者在调用发出之后,就直接返回了,被调用者处理完后通过通知或回调函数的方式告诉调用者结果。阻塞与非阻塞:阻塞:进程给CPU传达任务之后,被挂起一直等待CPU处理完成,期间什么事也不能干。 非阻塞:进程给CPU传达任务后,隔断时间再来询问之前的操作是否完成,期间可以做别的事情(这样的过程其实也叫轮询)阻塞:在re.
2020-07-29 15:23:08
440
原创 HTTP与HTTPS的区别
HTTP存在的风险:一、窃听风险:通信使用明文(不加密),内容有可能被窃听 HTTP协议本身不具备加密功能,故HTTP报文使用明文的方式发送; TCP/IP是可能被窃听的网络,通信内容在所有的通信线路上都有可能遭到窥视; 二、冒充风险:不验证通信方的身份,可能遭遇伪装 HTTP协议中的请求和响应不会对通信方进行确认,任何人都可以发起请求,服务器只要接收到请求,不管对方是谁都会返回一个响应,会有一些隐患:有可能是伪装的Web服务器、伪装的客户端、无法确定正在通信的对方...
2020-07-25 20:58:25
219
原创 Git、GitHub与GitLab
1.什么是版本控制系统?一种用于记录一个或多个文件内容变化,方便我们查阅特定版本修订情况的系统。2.版本控制系统的优点?以前在没有使用版本控制的时候,我们通常在我们的项目根目录下这样命名项目:project_v1、project_v1.1、project_v2等,通过这种方式记录我们项目的不同版本的修改,有时我们还会在不同版本的文件中写一个说明,记录此版本项目增、删、改等操作。这样的操作是很繁杂的,有的时候还可能因为一些非人为因素导致文件丢失这样的事故。 有了版本控制系统,我们就不用再手动进..
2020-07-21 13:48:28
177
原创 OpenStf
一、OpenStf是什么 OpenStf是一个web端移动设备管理平台,通过网页对移动设备进行管理和使用。可以实现从浏览器端远程调试、远程管理设备、远程执行shell脚本、远程拖拽安装App、远程查看日志、远程截屏等功能。 有点类似于现在比较流行的云测试平台,如:Testin、百度MTC等。很多公司内部团队现在都开始通过STF搭建自己的测试平台。OpenStf在Github上开源:https://github.com/openstfOpenStf官方网站:http...
2020-07-19 21:31:21
602
原创 去除字符串中的空格(C)
思路:不开辟新空间,直接在字符串上直接进行操作,把空格用后面的字符串填充。解法:除数组名本身这个指针外,只需创建一个指针来指向空格后面的字符,将字符赋给空格后,原字符所在位置置为空格,两个指针同时向后移动一步,继续循环直到指向字符的指针移动到数组末尾(即指针指向的值为'\0')为止。代码实现:#include<stdio.h>#include<string.h&...
2019-10-05 18:11:52
2758
1
原创 进程的三种状态及转换
一、进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态:就绪态(Ready) 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。执行态(Running) 当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。阻塞态(Blocked) ...
2019-09-28 16:41:05
6382
原创 数据结构:栈与队列
栈的原则是后进先出,即插入与删除元素均在栈顶进行。 (获取栈顶元素:s.top())队列的原则是先进先出,即插入数据在队尾进行,删除数据在队头进行。 (获取队头元素:q.front()) 用两个栈实现一个队列 思路:用两个栈,一个栈用来进队,一个栈用来出队,当数据进入队列的时候,我们将其压入一个栈,当数据出队的时候,我们将保存在栈内的数据pop出来,将其按照出栈的顺序压入另...
2019-08-22 17:30:47
472
原创 Linux:实现一个简单的线程池
线程池一、定义:线程池是一种线程使用模式。二、目的:线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。三、应用场景:需要大量的线程来...
2019-08-07 18:00:13
334
原创 Linux:理解用户态与内核态
目录一、用户态与内核态的概念二、为什么要有用户态和内核态三、用户态与内核态的切换在Linux的学习中经常会遇到用户态和内核态这两个术语,今天我们就来好好了解一下:一、用户态与内核态的概念 先看一下Linux整体架构图: 从图上我们可以看出来通过系统调用将Linux整个体系分为用户态和内核态(或者说内核空间和用户空...
2019-07-29 17:52:33
4286
原创 C++:浅析智能指针
智能指针是为了解决C++里防止程序员因为忘记释放资源而造成内存泄漏的问题RAII RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。 在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时...
2019-07-22 12:33:35
311
原创 C++:派生类指针赋值给基类指针问题
在C++继承中,很容易遇到一个问题,那就是将派生类指针赋值给基类指针(向上转型)的情况,下面我们就来举例分析:举一个多继承的例子:#include <iostream>using namespace std;//基类Aclass A {public: A(int a);public: void display();protected: int m_a;...
2019-07-20 22:55:12
6833
7
原创 C++:基类析构函数为什么要定义为虚函数
在C++实现多态里,有一个关于 析构函数的重写问题:基类中的析构函数如果是虚函数,那么派生类的析构函数就重写了基类的析构函数。这里他们的函数名不相同,看起来违背了重写的规则,但实际上编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor。那么为什么要把基类中的析构函数写成虚函数呢?原因:当基类指针指向派生类的时候,若基类析构函数不声明为虚函数...
2019-07-19 15:51:39
9031
3
原创 C++:模板总结
目录模板 函数模板: 类模板:模板一、定义: 模板是泛型编程的基础。(泛型:任意类型) 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。二、分类: 模板分为两类:函数模板:函数模板必须由编译器根据程序员的调用类型实例化为可执行的函数。 类模板三、优缺点: 优点:模板复用...
2019-05-12 14:24:07
214
原创 cookie与session的区别
1、什么是cookie和session http协议是一种无状态的协议,浏览器对服务器的每一次请求都是独立的。为了使得web能够产生一些动态信息,就需要保存”状态”,而cookie和session机制就是为了解决http协议无状态而产生。cookie是一种在客户端保存状态的方案,用来记录用户的一些信息,也是实现session的一种方式。 session是一种在服务器端保存...
2019-04-22 16:43:03
312
原创 多线程同步机制
多进程同步机制一般有四种方式:临界区(Critical Section) 互斥量(Mutex) 信号量(Semaphore) 事件(Event)临界区是指一段代码,这段代码是用来访问临界资源的。临界资源可以是硬件资源,也可以是软件资源。但它们有一个特点就是,一次仅允许一个进程或线程访问。当有多个线程试图同时访问,但已经有一个线程在访问该临界区了,那么其他线程将被挂起。临界区...
2019-04-20 22:24:38
1564
原创 进程调度算法
目录进程调度基础:进程调度算法:进程调度基础:一、进程调度的定义: 进程调度也称为低级调度(CPU调度),是按照某种调度算法(或原则)从就绪队列中选取进程分配CPU,主要是协调对CPU的争夺使用。二、进程调度的原因: 在操作系统中,由于进程综述多于处理机,它们必然竞争处理机,为了充分利用计算机系统中的CPU资源,让计算机系统能够多快好省地完...
2019-04-11 16:28:55
4230
原创 缓存(cache)浅析
一、什么是缓存? 缓存是介于中央处理器和主存储器之间的高速小容量存储器,不属于主存的一部分。(速度快、容量小、由硬件实现) 缓存用来存储一些常用或即将用到的数据或指令,当CPU需要这些数据或指令的时候直接从缓存中读取,这样比CPU到内存甚至硬盘中读取要快得多,能够大幅度提升CPU的处理速度(节省时间/提高效率)。二、为什么要有缓存? 由于...
2019-04-08 11:37:46
2043
原创 缺页中断与页面置换算法
目录缺页中断页面置换算法:LRU算法缺页中断 缺页:如果进程被调度,该进程需要使用的外存页(数据)不存在于数据块中,这个现象就叫做缺页。如果这个数据此时不在,就会将这个数据从加入到数据块首部。缺页本身是一种中断,与一般的中断一样,需要经过4个处理步骤:保护CPU现场 分析中断原因 转入缺页中断处理程序进行处理 恢复CPU现场,继续执行 ...
2019-04-06 17:42:26
5790
原创 二叉搜索树
目录基础知识一、性质:(非空树时)二、基本操作:三、性能:四、应用:代码实现基础知识一、性质:(非空树时) 若它的左子树不为空,则左子树上所有节点的值都比根小 若它的右子树不为空,则右子树上所有节点的值都比根大 它的左右子树也分别为二叉搜索树二、基本操作:1、查找:若根节点不为空: 如果根节点key ==...
2019-04-02 21:46:13
226
原创 IO多路转接之select、poll、epoll
目录selectpollepollIO分两步:<1> 等 <2> 数据拷贝高效IO:拷贝数据的比重越高 -->大部分时间进行数据传输 --> IO越高效 低效IO:等待的比重越高 -->大部分时间在阻塞等待-->IO越低效五种IO模型:(钓鱼例子 【前四种为同步IO,第五种是异步IO】)阻塞IO:...
2019-03-30 19:18:14
539
原创 HTTP无状态协议和Connection长/短连接
目录HTTP无状态协议Connection短连接:长连接:HTTP无状态协议1、定义:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。2、优点:服务器不用为每个客户端连接分配内存来记忆大量状态,也不用在客户端失去连接时去清理内存,以更高效地去处理web业务。3...
2019-03-21 22:31:49
1197
原创 MAC地址和IP地址是否缺一不可
答案是肯定的,我们来具体分析: 在网络传输的过程中,第一次将信息从A端发往B端时,首先在A端需要将信息从应用层开始到物理层进行逐层封装,到达B端后再从物理层到应用层进行逐层分用解包,最后拿到信息。 信息在进行封装时,到网络层的时候只知道对方的IP地址,却不知道对方的MAC地址,我们知道数据链路层使用的是以太网协议,发送以太网帧,而以太网帧里需要源MAC地址和目的...
2019-03-06 12:09:59
877
3
原创 详解HTTP协议
目录HTTP协议URLHTTP报文请求报文:响应报文:HTTP工作原理HTTP协议一、协议简介HTTP协议(超文本传输协议),是用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。 HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于...
2019-03-01 15:56:11
442
原创 排序算法之希尔排序
1959年Shell发明,是简单插入排序的改进版。它与插入排序的不同之处在于:它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。希尔排序一、基本思想: 把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。那么到最后的时候,插入的序列是一个大致有...
2019-02-21 14:44:42
224
原创 排序算法之三种基础排序算法(冒泡、选择、直接插入)
目录冒泡排序选择排序直接插入排序注:以下排序均默认为升序排序。冒泡排序一、基本思想: 从前往后,依次比较相邻的两个数,把较大的数放到后面;一次循环后,可以在当前最末尾位置得到一个当次循环的最大值。时间复杂度:O(n²) 空间复杂度:O(1) 排序稳定程度 :稳定 缺点:传统的冒泡排序中每一趟排序只能找到一个最大值或最小值,效率低。二、...
2019-02-20 14:58:10
354
原创 计算机网络基础:TCP协议之三次握手与四次挥手
在上一篇里,我们了解了传输层的TCP协议以及TCP协议实现的机制,接下来我们就来详解一下TCP协议的连接管理机制:连接管理 TCP提供面向有连接的数据传输,面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。 也就是说TCP协议需要在客户端与服务器成功连接之后才可使用,那么客户端与服务器的连接过程是什么呢?TCP建立连接:三次挥手 (客...
2019-02-11 17:10:16
424
原创 计算机网络基础之传输层
目录传输层的作用端口号UDP协议TCP协议TCP协议实现的机制传输层的作用 负责数据能够从发送端传输到接收端。端口号一、定义 用来识别同一台计算机中进行通信的不同应用程序,也被称为程序地址。 TCP/IP或UDP/IP通信中通过5个信息来识别一个通信:源IP地址、目的IP地址、协议号、源端口号、目的端口号。...
2019-02-09 18:11:09
641
原创 计算机网络基础之网络层
目录网络层的作用网络层与它上下层之间的关系IP地址IP协议路由控制IP数据包IP协议相关技术网络层的作用 为了实现终端节点之间的通信(将数据传输给对端的处理 / 在网络与网络互联的环境中,将数据从发送端主机发送到接收端主机) 简单来说就是:在复杂的网络环境中确定⼀个合适的路径,实现数据包的路由和转发网络层与它上下层之间的关系...
2019-02-07 16:39:52
1691
原创 计算机网络基础之数据链路层
目录数据链路层的作用以太网以太网帧格式理解MAC地址理解ARP协议理解MTU 数据链路层介于物理层和网络层之间,在物理层提供的服务的基础上向网络层提供服务。数据链路层的作用 两个设备(同⼀种数据链路节点)之间进行数据传递。以太网 以太网是⼀种技术标准,既包含了数据链路层的内容, 也包含了⼀些物理层的内容。例如...
2019-02-06 19:12:45
587
原创 C++:inline与#define的区别
内联函数inline概念: 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 从而能够提升程序运行的效率。特性:inline是一种以空间换时间的做法,省去调用函数的开销。所以代码很长或者有循环/递归的函数不适宜作为内联函数。 inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内...
2019-01-24 20:53:39
443
原创 C++多态之常见面试题
什么是多态?答:多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。什么是重载、重写(覆盖)、重定义(隐藏)?答:C++中不能进行函数重载的操作符:“?:” 、“.” 、“::” 、“sizeof” 和 ”.*”多态的实现原理?答:虚函数表。...
2019-01-20 16:00:56
880
原创 C++多态之虚函数表
上一篇里我们学习了多态的基本概念,下面我们就来看看C++到底是如何实现多态的:一、虚函数表下面这个基类中只包含一个int型的成员变量,但利用sizeof求类的大小结果却是8我们来看看b对象里都包含了什么:通过观察测试我们发现: 除了_b成员,还多一个__vfptr放在对象的前面,对象中的这个指针我们叫做虚函数表指针(v代表virtual,f代表 fun...
2019-01-20 14:07:19
435
原创 C++多态(基础)
继承可以实现代码复用,但它的主要用处是可以实现多态。多态一、概念 多态是指完成某个行为时,当不同的对象去完成会产生出不同的状态 举个例子:买票的时候,成人票全价,儿童票半价 简单的说:就是用基类的引用指向子类的对象。二、分类①动态多态:在程序运行时确定函数行为。(动态绑定,晚绑定)虚函数的重写(覆盖):派生类中有一个跟基...
2019-01-15 22:32:44
317
原创 C++继承之菱形继承
在学习菱形继承之前,我们先了解两个概念:单继承、多继承。单继承:一个子类只有一个直接父类时称这个继承关系为单继承。 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承。 菱形继承 菱形继承是多继承的一种特殊情况。 接下来我们...
2018-12-27 12:30:49
633
原创 C++继承(基础)
赋值兼容规则 public继承方式下,派生类对象可以赋值给基类的对象/指针/引用,但是基类不能赋值给派生类。可以将派生类的对象看成是基类的对象 在使用基类对象的位置,都可以使用派生类对象进行替换 基类的指针/引用可以指向派生类的对象派生类的默认成员函数若基类的构造函数存在:基类为缺省的构造函数:如果派生类没有显式定义构造函数,编译器就生成一个默认的构造函数,要...
2018-12-27 10:39:37
497
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人