自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(152)
  • 资源 (1)
  • 收藏
  • 关注

原创 消息

代码的消息表达式如何转换为对objc_msgSend函数的调用 如何通过名字来指定一个方法 如何使用objc_msgSend函数获得方法的地址 避免动态绑定的唯一办法就是取得方法的地址,并且直接像函数一样调用它。当一个方法会被连续调用很多次,而且你希望节省每次调用方法都要发送消息的开销时,使用方法地址来调用方法就显得很有成效。methodForSelector:使用...

2020-03-02 11:29:15 254

原创 OC基础

OC相对于C在C的基础上新增了一小部分面向对象的语法。 将C的复杂的,繁琐的的语法进行了封装。 OC完全兼容C语言后缀名OC程序的源文件后缀名是.m,m代表message,代表OC中的消息机制 C语言的后缀名是.c程序入口、返回值发回值为int类型,代表程序结束的状态 main函数的参数:仍然可以接受用户在运行程序时候传递数据给程序 参数也可以不要#import指令...

2020-02-05 12:21:56 366

原创 ios链式编程

首先我们看一下使用Masonry对控件进行布局的代码格式。[self.bottomView1 mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(20); make.width.mas_equalTo(30); make.bottom.m...

2019-12-07 11:25:10 238

原创 Masonry

什么是Masonry Masonry是一个对系统NSLayoutConstraint进行封装的第三方自动布局框架,采用链式编程的方式提供给开发者API。系统AutoLayout支持的操作,Masonry都支持,相比系统API功能来说,Masonry是有过之而无不及。 Masonry采取链式编程的方式,代码理解起来清晰易懂,而且写完之后代码量看起来非常少。之前用N...

2019-12-06 16:36:11 161

原创 ios网络请求

ios请求概述 在ios开发中,网络请求并不是特比额复杂,这得益于一个给力的第三方库——AFNetworking的出现。 AFNetworking 1.0建立在NSURLConnection的基础API之上,AFNetworking 2.0开始使用NSURLConnection的基础API和部分NSURLSession基础之上的API。现有的AFNetworking...

2019-11-26 21:11:06 934

原创 block传值

场景分析有两个页面:第1个页面、第2个页面。 第1个页面上有一个label,和一个按钮。 第2个页面上有一个txetField,和一个按钮。 点击第1个页面的按钮会跳转到第2个页面。 在第二个页面往txetField中可以输入文字,点击按钮会返回到第1个页面,并且会将txetField中的文字传到第1个页面并显示到第1个页面的label上。代码第2个页面//第1步:声明bl...

2019-11-26 11:45:38 105

原创 代理传值

场景分析有两个页面:第1个页面、第2个页面。 第1个页面上有一个label,和一个按钮。 第2个页面上有一个txetField,和一个按钮。 点击第1个页面的按钮会跳转到第2个页面。 在第二个页面往txetField中可以输入文字,点击按钮会返回到第1个页面,并且会将txetField中的文字传到第1个页面并显示到第1个页面的label上。分析因为第2个页面想要将自己的数据显示在...

2019-11-26 11:27:13 114

原创 UIWindow、UIView

ios系统架构ios是基于unix的,unix是所有开发系统的鼻祖,windows也是基于unix系统的。从稳定性来说它比其他系统稳定的多。 ios的系统架构分为四个层次:核心操作系统层、核心服务层、媒体层、可触摸层。UIView简介在屏幕上,所有看得见的东西都是UIView,比如按钮、图片、文字,所有控件最终都继承自UIView。它是这些控件的父类。 每一个UIView都是一个...

2019-11-25 14:43:25 142

原创 block

概述 苹果在ios4.0版本开始支持block。对于不同编程北京的人来说,对block的理解也不尽相同。c语言擅长者,可以把block理解成函数指针。通俗讲,可以把block理解成为一个内部函数。如下:function outerFn(){ function innerFn() { /*在这里添加代码*/ }} 在ob...

2019-11-06 14:14:33 160

原创 git学习总结

一、git简介1、git是什么?git是目前世界上最先进的分布式版本控制系统(没有之一)。2、分布式vs集中式集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送到中央服务器。中央服务器就好比是一个图书馆,你要修改一本书,必须先从图书馆把书借出来,然后回家自己改,改完了再放回...

2019-11-05 19:46:15 209

原创 TCP/IP——链路层

1、链路层的目的为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP发送RARP请求和接收RARP应答注意:TCP/IP支持多种不同的链路层协议,这取决于网络使用的硬件,如以太网、令牌环网、FDDI等。2、以太网和IEEE 802封装 以太网是TCP/IP采用的主要的局域网技术,它采用一种称作CSMA/CD的媒体接入方法,其意思是带...

2019-03-30 20:24:06 491

原创 TCP/IP协议族——概述

1、分层网络协议通常分不同层次进行开发,每一层负责不同的通信功能。TCP/IP通常被认为是一个四层协议系统,如下:链路层:该层通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他传输介质)的物理接口细节。 网络层:处理分组在网络中的活动,例如分组选择。 运输层:主要为两台主机上的应用层提供端对端的通信。 应用层:负责处理特定的应用程序细节。2、...

2019-03-29 15:10:35 243

原创 单例模式的双重if判断与线程安全

单例模式单例模式是指设计一个只能构造一个对象的类。简单来说就是在一个进程运行过程中只可以存在一个该类的对象。单例模式的对象获得设计方式A* getA(){ if(_a == NULL) { lock() if(_a == NULL) { _a = new A(); } }...

2019-03-28 17:21:59 1455

原创 同步异步、阻塞非阻塞

首先我们要清楚同步异步和阻塞非阻塞是两种不同的概念,针对的是不同的层面:同步异步:关注的是消息通信的层面。 阻塞非阻塞:关注的是程序在等待调用结果时的状态。同步异步同步:强调在发出一个请求或功能调用时,主动等待返回结果。在结果没得到前,不能返回或向下执行。异步:强调在发出一个请求或功能调用时,不用等结果,继续向下执行,当有结果时,由被调用方通知主调方,主调方再拿结果示例:情...

2019-03-27 14:30:43 243

原创 线程池

什么是线程池 线程池就是提前创建一些线程,它们的集合叫做线程池。程序会将任务交给线程池,线程池会分配一个空闲的线程取执行任务,等待任务执行完成之后,该线程不会被销毁,而是重新还给线程池。这样减少了大量的线程创建销毁的操作,提高了程序的执行效率。线程池的工作原理在有任务要执行时,不用想内核去申请创建线程,而是将任务交给线程池,线程池分配一个空闲的线程取执行任务在任务执行完毕...

2019-03-20 15:38:45 138

原创 进程、线程和协程

进程:进程就是应用程序的启动实例,比如我们打开一个游戏、运行一个软件,就是开启了一个进程。进程拥有代码和打开的文件资源、数据资源、独立的内存空间。线程:线程从属于进程,是程序的实际执行者。一个进程至少包含一个线程,也可以拥有更多的线程,线程拥有自己的栈空间。协程:协程的出现是为了解决进程和线程存在的问题的。使用多进程和多线程往往效率往往都不高(多线程比多进程效率高),因为在同步时会不可...

2019-03-20 15:22:31 177

原创 C++空类默认的函数

构造函数 拷贝构造函数 析构函数 默认复制运算符 重载取地址运算符 重载取地址运算符const函数class MyClass{public: MyClass(const char * str = nullptr); // 默认带参构造函数 // 默认构造函数指不带参数或者所有参数都有缺省值的构造函数 ~MyClass(void); // 默认析构函数...

2019-03-20 14:39:37 495

原创 STL容器

1、顺序容器vector:底层实现是数组。分配内存的方式: 当定义vector的适合不分配内存,第一次插入元素分配一个单元的内存空间,之后每当分配的空间用完之后则进行扩容,扩容的倍数根据编译器而定。注意vector的扩容是重新开辟一块空间将原来的元素存入,而不是在原来的空间后边补充。 缩容则和扩容相反,同样是重新申请空间。迭代器的失效: ...

2019-03-19 11:53:10 173

原创 多进程和多线程

在介绍多进程和多线程之前,首先搞清楚一个问题,多进程和多线程解决的是什么问题?或者说为什么需要多进程和多线程?1、并发 对于一个程序,如果只有一条执行路径,那么效率将会是非常低的,一个程序往往有多个部分组成,每个模块执行不同的任务,如果让这些任务同时执行,各自完成自己的任务,将会使效率得到大大的提升。2、多进程 进程是一个正在执行的程序。对于并发执行,那就不可...

2019-03-18 22:37:45 117

原创 大整数相乘

题目描述:有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。思路分析:根据我们手算的规则定义一个新的字符串来表示结果,新的字符串长度为想成的两个字符串之和 将第二个数从右到左每一位与第一个数计算,将计算的结果加到新字符串的合适位置。注意:计算的时候要保存上一次计算的进位数。 维护一个移位数,第二个字符串每算完一位,移位数要加1。移位数也决...

2019-03-17 21:52:02 330

原创 B-树

背景 对于二叉平衡树、红黑树,其查找的时间复杂度都为O(logn)。但是考虑到一个实际情况:在对大量数据进行存储查找的时候,采用这种数据结构往往会使得树的深度十分庞大,此时定位到目标节点也往往会遍历到一定深度才可以达到,那么在实际使用中效率就十分低下了,这种效率低下的产生就不是由于数据结构而引起的了,而是跟操作系统的设计有关。操作系统大多使用页来管理内存,当存储大量数据时,其肯定不...

2019-03-17 18:01:40 373

原创 判断一个树是否是另一个树的子树

题目描述:输入两棵二叉树A、B,判断B是否是A的子树思路:先找到A中与B根节点相同的节点 从该节点递归的判断是否其左右子树都相等代码:class Solution {public: bool fun(TreeNode* pRoot1, TreeNode* pRoot2) { if(pRoot2 == NULL) { ...

2019-03-15 20:52:29 526

原创 数组中重复的数字

思路:我们可以重排这个数组,原则就是将每个数字放在与它下标对应的位置上去,如果发现该下标位置上的数与自己相等,那么说明该数字重复了。因此从0下标开始,将这个下标对应的数字找出来放到该位置。# include<iostream># include<vector>using namespace std;int fun(vector<int> arr...

2019-03-14 21:57:11 125

原创 二进制中1的个数

思路:对于一个整数,每次与它减一的数做与运算,总会消除它二进制中最右边的1。因此直到它做与运算到0是的次数即为它二进制中1的个数# include<iostream>using namespace std;int fun(int n){ int count = 0; while (n) { count++; n = n &(n - 1); } r...

2019-03-14 21:15:52 105

原创 长连接和短连接

相信很多人听到长短连接就会联系到http协议,并且很清楚http1.1之前是没有长连接的,直到http1.1才出现长连接,而且http1.1默认使用长连接。什么是长连接和短连接? 很多人在这里就会有这样一个误区:http协议分为长连接和短连接 为什么说这是一个误区呢,首先我们回顾以下http协议,http是应用层的请求/响应协议,http协议只是对客户发来的请求做出...

2019-03-14 20:23:23 293

原创 重载、重写、隐藏、覆盖

重载:重载是指在同一作用域内,具有相同函数名但是参数列表不同的函数之间构成重载。总结为以下特征:同一作用域 函数名相同 参数列表不同重写:重写是在父子类之间,也叫做子类隐藏父类。子类拥有和子类相同返回值、函数名、参数列表但是函数实体不同的函数,这样的情况叫做重写。总结为以下特征:发生在在父子类中 返回值、函数名、参数列表均相同隐藏:子类会隐藏父类中同名的函数。总结为以下特征:...

2019-03-14 17:47:05 131

原创 栈溢出

在想搞明白栈溢出之前,我们先弄清楚另外一件事:函数调用栈的过程函数调用栈过程用ebx寄存器和esx寄存器来表示一个函数栈帧,ebx表示栈底指针、esx表示栈顶指针。函数调用栈的过程如下:开辟栈帧函数参数入栈:参数入栈的顺序是从右向左,当参数小于8个字节的时候用寄存器记录参数值,并将寄存器中的值入栈;当参数大于8个字节的时候,首先将主调函数的栈顶指针向上移动参数大小的位置,然后将参数...

2019-03-13 20:46:28 196

原创 内核栈和用户栈

内核在创建进程的时候创建进程控制块以及进程的堆栈。每个进程有两个栈:用户栈、内核栈用户栈在用户地址空间中,内核栈在内核地址空间中。用户栈 用户栈不难理解,用户栈是用户空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值以及局部变量等信息。在linux系统中,用户栈的大小一般为8M。可以通过ulimit -s来手动设置。进程用户栈和内核栈的切换 ...

2019-03-13 15:50:14 11465 9

原创 堆和栈的区别

栈:栈区空间由操作系统分配与释放,用于存储局部变量、函数参数等。函数种定义的变量按定义的先后顺序入栈,其操作方式类似于操作系统中的栈。栈的内部地址是由高到低分配的,因此后定义的变量在栈中的地址低于先定义的变量。堆:堆区的空间由程序员自主分配与释放,程序员没有主动释放则在程序结束时由操作系统回收。堆区的内部地址生长方向与栈相反,由低到高。1、管理方式不同栈区空间操作系统自动分配释放 堆...

2019-03-13 14:22:55 289

原创 信号量和互斥锁的区别

信号量是用在多线程多任务同步的,互斥锁是用在多线程多任务互斥的信号量可以做到一个线程完成了某个动作就通过信号量告诉别的线程,别的线程再进行某些动作。互斥锁是指一个线程使用某个资源通过对其加锁而使得其他线程无法访问,直到这个线程解锁,其他线程才可以继续访问。...

2019-03-10 13:25:15 1600 1

原创 互斥和同步

互斥:是指散布在不同进程之间的若干程序片段,当某个进程执行其中的一个程序片段时,其他进程就不能运行它们之中的任一程序片段,只能等到该进程运行完之后才可以继续运行。同步:是指散布在不同进程之间的若干程序片段,它们的运行必须严格按照一定的先后次序来运行,这种次序依赖于要完成的任务。比如数据的收发,必须发送方发送了接收方才能收。 同步是一种更为复杂的互斥吗,而互斥是一种特殊的同步。...

2019-03-10 12:43:22 11517 1

原创 epoll详解——从功能到内核

首先我们了解以下什么是I/O复用。I/O就是指网络中的I/O(即输入输出),多路是指多个TCP连接,复用是指一个或少量线程被重复使用。连起来理解就是,用少量的线程来处理网络上大量的TCP连接中的I/O。常见的I/O复用有以下三种:select poll epoll为什么使用epoll?这个问题也可以理解为epoll相比于select和poll有什么缺点。首先我们来分析...

2019-03-09 21:55:24 360

原创 域名系统DNS

域名系统是互联网使用的域名系统,用来把便于人们使用的机器名字(即我们常说的网址)转换为IP地址。许多应用层软件经常直接使用域名系统DNS,虽然计算机的用户只是间接而不是直接使用域名系统,但DNS却为互联网的各种网络应用提供了核心服务。 互联网的域名系统DNS被设计成为一个联机分布式数据库系统,并采用客户服务器方式。DNS使大多数名字都在本地进行解析,仅少量解析需要在互...

2019-03-08 22:59:46 810

原创 ping命令的原理

首先,我们来看一下ping命令的作用:简单来说,ping是用来检测本机与网络中的某个主机是否可达命令,如果两台主机之间ping不同,则表明两台主机之间不可建立连接。ping是定位网络通不通的重要手段。ping命令的原理 ping命令是基于ICMP协议来工作的,ICMP是Internet控制报文协议。ping命令会发送一个ICMP回显请求报文给目标主机,并等待目标...

2019-03-08 19:35:45 774

原创 ARP协议

在介绍ARP协议之前,我们先来区分一下IP地址和网络地址。IP地址:是网络层及以上各层使用的地址,是一种逻辑地址,IP地址是使用软件实现的。MAC地址:是数据链路层和物理层使用的地址。 发送数据时,数据从高层到底层,通过每一层时则加上该层对应的协议报头,直到最底层(链路层),才发送到通信链路上进行传输。使用IP地址的IP数据报一旦交给数据链路层,就被封装成MAC帧,MAC帧...

2019-03-08 17:10:36 198

原创 10亿数据找出前100大的数据

方法1:利用堆排实现取前m个数,建立一个小根堆。建堆的时间复杂度为O(mlogm) 顺序读取后边的元素,如果该元素比堆顶的元素小,直接丢弃。如果大于堆顶的元素则替换它,然后调整堆,最坏的情况是每一次都需要调整堆。时间复杂度为O(nlogm)。n为数据总数,m表示前m大的数。方法2:快排划分的思想首先对数据进行划分,并且划分之后,持续对基准右边的数据继续递归 直到右边的数据小于100,...

2019-03-07 21:59:05 3129

原创 TCP协议的安全机制——滑动窗口

网络出现堵塞一般有两种情况:网络内部出现瓶颈,这个问题TCP协议有专门的解决方法,具体请看:TCP拥塞控制 接收方容量太小,因此就需要进行流量控制,也就是本文的重点:滑动窗口 流量控制的原理很简单,如果发送方发送的数据量远大于接收方的容量,就会出现阻塞,对此可以维护一个接收窗口大小,接收方每次告诉发送方:这是我的窗口大小,不要发多了。 那为什么叫滑动窗口呢?接下来我...

2019-03-07 20:21:57 716

原创 IP报头

IP协议是TCP/IP协议族中最为核心的协议。所有的TCP、IP、ICMP、IGMP数据都以IP协议数据报格式发送。IP协议提供无连接、不可靠的数据报传送服务。不可靠:它不保证数据能成功地发送到目的地,IP协议仅提供最好地传输服务。如果发生某种错误,如路由器暂时用完缓冲区,IP协议的处理算法是:丢弃该数据报,然后发送ICMP消息给发送源(告诉发送源为什么丢弃).任何要求的可靠性都需...

2019-03-07 19:25:46 5292 1

原创 一致性哈希算法

一致性哈希是一种常永于负载均衡的分布式算法。首先我们看一个案例:1、我们有3台服务器S0、S1、S2.2、与此同时我们还有10万张图片需要均匀的缓存在这三台服务器上如何实现将图片均匀的缓存在三台服务器上来减轻缓存的压力一、传统哈希算法首先对图片名称进行哈希计算得到哈希值 用这个哈希值对机器数取模算出该放在哪一个服务器上假设对图片名称进行哈希计算得到的数值为6,此时服务器数为...

2019-03-06 23:13:06 165

原创 进程和线程的区别

进程:进程是一个正在运行的程序,进程是资源分配的最小单位线程:线程是程序执行的最小单位,一个进程可以由多个线程组成,多个线程共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由cpu独立调度执行,在多cpu下就允许多个线程同时运行。线程和进程之间的区别进程是资源分配的最小单位,线程是程序执行的最小单位 进程有自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据...

2019-03-06 21:53:32 189

epoll源码剖析

本文详细介绍了epoll的原理和Linux内核中如何实现epoll_create、epoll_ctl、epoll_wait.

2019-02-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除