自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 理解TCP:三次握手,四次握手,可靠数据传输、流量控制、拥塞控制

理解TCP:三次握手,四次握手,可靠数据传输、流量控制、拥塞控制TCP有主要有两个特点:面向连接:需要客户端和服务器在发送数据之前有连接可靠传输:客户端与服务器之间发送的数据是可靠的(无损坏,按顺序)下面总结一下TCP的一些知识点:三次握手用于客户端和服务器建立连接第一步:客户端向服务器发送一个特殊的TCP报文段,表示想建立连接(SYN=1)第二步:服务器收到该报文,向客户端发送允许连接的报文段(SYN=1,ACK=1)第三步:客户端收到该报文,向服务器发送连接成功的报文段(ACK=

2020-11-15 23:14:08 302

原创 HTTP 与 HTTPS 的区别

HTTP 与 HTTPS 的区别一句话总结:HTTP以明文方式发送内容,不验证服务器身份,不提供数据加密HTTPS在HTTP基础上加了SSL协议,验证服务器身份,加密传输的数据下面具体总结一下HTTPS如何实现身份验证+数据加密的:数据加密:客户端和服务器之间的数据加密是对称的(这是为了提高效率,数据很多的情况下,非对称加密效率低),实现对称加密,只需要一把钥匙(简称密钥),密钥只有客户端和服务器知道,其他人不知道。这把密钥的是由客户端生成的,生成过程采用非对称加密,具体过程如下客户端向服

2020-11-14 17:31:16 119

原创 OC 多线程:NSThread,GCD,NSOperation

OC 多线程:NSThread,GCD,NSOperationOC 常用的多线程实现方法有:NSThreadGCDNSOperation下面逐一总结一下。NSThreadNSThread是官方提供的,面向对象的创建多线程的方法。NSThread可以随时查看当前代码所在的线程。比如:NSLog(@"%@", [NSThread currentThread]);// <NSThread: 0x6000007f0000>{number = 1, name = main}NS

2020-11-11 22:27:42 368

原创 OC 多线程基础知识:锁

OC 多线程基础知识:锁想要深入理解多线程,锁是预备知识,这里总结一下OC中锁相关的知识,打好基础。为什么要有锁?锁概念的提出,是为了解决多线程资源共享的问题,在多线程环境下,有的资源可能会同时被多个线程访问,可能会出现资源抢夺的问题。这里引入一个概念叫临界区(Critical Section),就是一段代码,同一时间只能由一个线程访问,以保障临界区内的线程是安全的(资源不被抢夺,改变)。锁就是用来解决临界区内线程安全的问题。下面介绍三种常见的锁:自旋锁(spin lock)自旋锁长这样:wh

2020-11-09 23:46:35 380

原创 OC 多线程基础知识:进程、线程、并行、并发、线程的生命周期,互斥锁,自旋锁

OC 多线程基础知识:进程、线程、并行、并发、线程的生命周期,互斥锁,自旋锁进程(process)就是一个运行的程序,比如一个运行的App。有独立的逻辑内存空间。线程(thread)进程中一路单独运行的程序,一个进程由一个或多个线程构成。各线程共享相同的代码和全局数据,但各有其自己的堆栈。进程和线程的关系进程之间的内存空间是独立的,同一进程的线程共享进程的内存空间。进程之间的资源(I/O,CPU)是独立的,同一进程的线程共享进程的资源。一个进程奔溃后,不影响其他

2020-11-08 23:32:49 303

原创 理解 OC 中 RunLoop

理解 OC 中 RunLoop什么是RunLoop?可以简单理解为,让程序保持运行的一个while循环,这个循环内监听各种事件(如触摸事件、performSelector、定时器NSTimer等),没有事件的时候睡眠,从而有效的利用CPU(只有在有事件的时候才用CPU,没事件的时候睡眠)不管RunLoop有多复杂,其本质就是上面所说的:一个循环,有事件的时候处理事件,无事件的时候休眠(这里的睡眠是指用户态切换到内核态,这样的休眠线程是被挂起的,不会再占用cpu资源)。RumLoop与线程有如下关系:

2020-11-07 09:21:10 1973 4

原创 OC 中 KVO 的原理总结

OC 中 KVO 的原理总结KVO(Key Value Observing),可以用来监听一个对象键值的变化,当键值变化时,触发回调函数,做相应的操作,主要用法总结如下:// 注册Observer: observer:观察者, keyPath:要观察的属性名称, options:对KVO机制进行配置, context: 传入任意类型的对象addObserver:forKeyPath:options:context:// 接收通知: keyPath:被监听的对象的属性,object:被监听的对象,c

2020-11-04 21:18:03 234

原创 OC Block 原理总结

OC block 原理总结本文重点总结 OC block 的原理,并带上一些例子,不讨论 block 的写法和应用。block 的本质总结如下:block 在底层上是一个结构体,内部有一个isa指针,指向block所属的类,其父类最终指向NSObject,所以可以把block看做对象:void (^ blk)(void) = ^{ NSLog(@"hello");};NSLog(@"%@", [blk class]); // __NSGlobalBlock__NSLog(@"%@"

2020-11-03 23:31:53 422 2

原创 OC Runtime 常见的应用

OC Runtime 常见的应用OC Runtime特性让他具有一些新功能,可以应用在日常的工作中,下面介绍 Runtime 中常见的应用,可以简要总结为以下几点(都要用到<objc/runtime.h>库):方法交换(Method Swizzle)给分类(Category)添加属性实现类的自动归档和自动解档实现字典转模型方法交换(Method Swizzle)就是利用以下方法(来自<objc/runtime.h>库):// 获得某个类的实例对象方法Method

2020-11-03 21:56:56 135

原创 OC 中的消息发送和消息转发

OC 中的动态绑定和消息转发动态绑定我们都知道OC是动态语言,表现为对象方法的调用实际上是对对象发送消息,编译时不确定这个对象执行什么方法,而在运行时由消息(方法选择器selector决定对象执行什么方法),这种消息发送的方式叫做动态绑定。通过编译我们知道,发送消息的底层API是objc_msgSend这个c函数,其工作流程大概是这样的(为了方便参考,这里也给出了相关数据结构的源码):// 类的数据结构struct objc_class { Class isa OBJC_ISA_AVAIL

2020-11-02 23:30:50 275

原创 理解 id, Class, isa, SEL, IMP, Method

理解 id, Class, isa, SEL, IMP, Methodid 类型首先介绍两个概念:静态类型和动态类型。静态类型:将一个指针变量定义为特定类的对象时,使用的是静态类型,在编译的时候就知道这个指针变量所属的类,比如:(下面的p指针就是静态类型)NSString *p = [[NSString alloc] init];动态类型:程序运行时才确定变量的类,比如:(下面的p指针在编译的时候不知道自己的类型,直到运行时才直到)id p = [[NSString alloc] init];

2020-11-01 23:09:36 253

原创 简单理解 OC 中的 runtime

简单理解 OC 中的 runtimeruntime 是 OC 中一套底层的c语言API(包括<objc/runtime.h>和<objc/message.h>),正在这套API,让 OC 语言具有了动态的特性,其实OC语言在编译后,最终都会转化为运行时代码。所谓动态特征,其实就是:动态类型:运行的时候确定对象类型,比如id类型,一开始可以代表任何类型,赋值后才转化为具体类型动态绑定:运行的时候确定方法的调用,基于第一点,当一个类型动态地被确定后,其方法和属性才被动态的确定

2020-10-30 22:30:01 342

原创 OC 中 load 和 initialize 的区别

OC 中 load 和 initialize 的区别load:+load是一个类方法,当程序载入时,在main函数执行之前,带有+load方法类(Class)或者种类(Category)就会执行+load方法(每个+load方法只执行一次),比如:@interface Person : NSObject@end @implementation Person+(void)load { NSLog(@"Person is loaded");}@end int main(in

2020-10-29 23:09:18 248

原创 OC 中 strong, weak, assign, copy 的区别

OC 中 strong, weak, assign, copy 的区别strong强引用,只可以修饰对象,属性的默认修饰符,其修饰的对象引用计数增加1weak弱引用,只可以修饰对象,指向但不拥有对象,其修饰的对象引用计数不增加,可以避免循环引用,weak修饰的对象释放后,指针会被系统置为nil,此时向对象发送消息不会奔溃assign可以修饰对象和基本数据类型,如果修饰对象,其修饰的对象引用计数不增加,可以避免循环引用,但assign修饰的对象释放后,指针不会被系统置为nil,这会产生野指针的问题

2020-10-28 23:04:38 645

原创 OC 中种类(Category)和扩展(Extension)的区别

OC 中种类(Category)和扩展(Extension)的区别种类(Category)种类中只能添加方法,不能添加实例变量和属性如果种类中有和原类同名的方法,会优先调用种类的方法种类有独立的implementation文件通常种类的头文件命名为Class+Category.h,implementation文件命名为Class+Category.m种类的方法是在运行阶段加入对应的类中的,这意味不写种类方法的实现也可以编译通过,但运行时会报错扩展(Extension)扩展中可以定义私有

2020-10-28 22:13:21 382

原创 OC 创建对象和 Swift 创建对象的区别

OC 创建对象和 Swift 创建对象的区别Objective-C创建对象的方法和 Swift 天差地别,Swift 创建对象的步骤可以简要总结为:自底向上(从子类到父类),初始化所有的储存属性。第一点结束后,才能使用属性和方法。想要了解更多关于Swift初始化对象的知识,可以看我之前的这篇文章。而 OC 创建对象的特点是:不需要给属性设定默认值, Objective-C 会自动把对象设定为 nil,数字设定为 0。初始化自己的属性之前,必须要调用父类的 init 方法。初始化完自己的

2020-10-27 23:25:39 246 2

原创 理解 OC 中实例变量(Instance variables)和属性(property) 的区别

理解 OC 中实例变量(Instance variables)和属性(property) 的区别OC中的实例变量(Instance variables):OC中的实例变量(Instance variables)正如其名,就是一个实例中的变量(也就是 Swift 中的属性),可以是公开的(pubilc),也可以是(private)的,其创建方式如下(注意,定义的时候放在@interface后的花括号里):@interface Person : NSObject{ @public NSStrin

2020-10-27 23:06:31 543

原创 OC 中 NSString 以及和 NSMutableString 的区别

OC 中 NSString 以及和 NSMutableString 的区别Objective-C中的 NSString 是基础中的基础,现在总结一下 NSString 的知识点,以及和 NSMutableString 的区别。NSString 的创建方法最常见的方法就是使用 @ 符号+字符串NSString *word = @"simple";为什么要加 @ 符号呢?这里介绍一下 @ 符号,这是 OC 的语句符号,用来区分 C 语言,每当你看到 @ 符号,可以理解为:接下来执行的代码是 OC ,

2020-10-26 23:29:51 264

原创 Swift类和子类的初始化总结

Swift类和子类的初始化总结Swift中类和子类的初始化有一定的规则,不是很容易理解,现在简单梳理一下:两段式初始化( two-phase initialization)首先要记住一点,Swift中类的初始化的时候,所有存储属性(Stored Property)要么有初始值,要么在初始化的时候通过init赋值(optional 除外),否则编译不通过,比如:class Car { let wheel: Int let windows: Int init(windows: I

2020-10-24 15:44:38 802

原创 Swift中属性(Property)的分类

Swift中属性(Property)的分类在Swift的学习过程中,我发现理解属性,对后续学习类(Class)、枚举(Enumeration)和协议(Protocol)很有帮助,现在总结一下Swift中属性的分类,主要分为四大类:存储实例属性(Stored Instance Property):存储在实例的内存中的属性,只有一份计算实例属性(Computed Instance Property):不占用系统内存,调用的时候才计算得出的实例属性,类似实例的方法存储类型属性(Stored T

2020-10-24 10:12:04 1086

原创 理解Swift中的关键字throw和rethrows

理解Swift中的关键字throw和rethrowsSwift中throw和rethrows关键字用于异常处理(Error handling),都是用在函数中,可以简单理解为throw让函数或者方法可能出现的异常得到处理(比如用do-catch处理),而rethrows只是传递throw,本身没有针对函数或方法,下面详细解释一下:throwthrows关键字首先用在函数申明中,放在返回类型的前面,比如标准库中map的函数签名:func map<T>(_ transform: (Int)

2020-10-21 23:37:56 1677 1

原创 为什么Swift字符串不能用整数索引

为什么Swift字符串不能用整数索引Swift中,字符串是不能使用整数索引的,比如下面的代码会报错:let name = "Neil"name[2]// 'subscript(_:)' is unavailable: cannot subscript String with an Int, use a String.Index instead.这是为什么呢? 简单的回答是:Swift认为字符串是由一个个**字形群集 (grapheme clusters)**组成的,字形群集的大小不固定所以不能用

2020-10-19 23:31:05 901

原创 Swift 中的Range类型和 Range运算符

Swift 中的Range类型和 Range运算符ClosedRangeRangePartialRangeThroughPartialRangeFromPartialRangeUpToSwift中有五个最常用的Range类型:• ClosedRange: a…b• Range a…<b• PartialRangeThrough: …b• PartialRangeFrom: a…• PartialRangeUpTo: …<b对应的,有五个Range运算符,用来定义上面的Range类型

2020-10-11 22:58:57 1012

空空如也

空空如也

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

TA关注的人

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