自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 原型模式

原理原型模式一般用于实例对象功能相同,且需要重复生成多个相同类型仅仅只有数据有区别的实例对象。例如我们需要打印一个年级其中一个班级的学生的简历或档案的信息,这个时候我们需要生成多个相同的实例,这种情况我们回归到代码中一般就是用原型模式来处理。在项目中有时候我们可能也需要对某个实例对象进行多次临时拷贝操作,也可以考虑使用原型模式,操作起来更加地方便。角色原型模式包含以下角色:抽象原型...

2020-03-21 09:46:51 132

原创 建造者模式

缘由无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一辆完整的汽车,所以我们引入了建造者模式来进行设计,实现将复杂对象本身与创建细节进行解耦。定义建造者模式:将复杂对象的创建与它的表示相分离,使得相同的构建过程可以生成不同对...

2020-03-21 08:34:35 147

原创 传输层TCP与UDP

TCP概念TCP提供了一种面向连接、安全可靠,基于字节流的传输层控制协议。TCP是一种全双工传输方式,由于在保证数据可靠传输时使用了握手认证,超时重传,拥塞控制等操作,导致TCP传输效率相对较低,但是却保证了数据的准确性。首部字段解析源端口和目的端口:端口为我们提供了一种服务进程,用于标识不同的应用程序。假设我们将同一地址用于Web程序、FTP程序通信,使用端口可以用于识别出这些...

2019-06-17 21:09:43 200

原创 Runloop与UITableView简单结合

Runloop性质概述当程序执行时,默认线程执行完任务就退出了,如果我们想线程持续地处理事件,则需要为线程添加循环机制Runloop,Runloop是事件分发和实现的机制; Runloop是一个对象,这个对象处理线程持续执行程序运行中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而使程序持续运行。在没有需要处理事件时休息,在有事件到来是唤醒处理,节省C...

2019-06-16 14:43:40 331

原创 抽象工厂模式

缘由在工厂模式中,具体工厂只负责出具体的产品,每一个具体工厂对应一个具体产品;工厂方法也具有唯一性,一个具体工厂方法中只有一个或一组重载的工厂方法。当我们所生产的具体产品不是一个简单的对象,而是拥有多个不同产品等级结构的具体产品对象组成,此时需要我们使用抽象工厂模式!定义抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须...

2019-06-07 17:52:37 102

原创 工厂方法模式

工厂方法模式缘由由于简单工厂模式违法了开闭原则,假设我们要生成创建新的按钮,就必须修改工厂类的判断逻辑,所以引出了工厂方法模式!改进我们将不再通过一个工厂类并将生成对象逻辑编写于类中,而是通过生成一个抽象的产品类和一个抽象的工厂类,通过继承实现一个具体产品类和一个具体工厂类,每当我们需要生成新的产品时,则需通过生成具体工厂类来实现封装具体产品的创建过程,这种不用去修改具体工厂类的实...

2019-05-21 23:31:46 98

原创 简单工厂模式

简单工厂模式目录简单工厂模式缘由改进反面教材正面教材优点缺点适用环境缘由假设在一个项目工程中,我们需要显示不同样式的按钮,当这些按钮在不同的功能模块中出现,这时我们在不同功能模块都创建显示的按钮,会导致后期项目维护起来相对比较困难,后期若是想修改某个功能的按钮样式,我们需要查找相对应的代码再进行修改,可能导致一个小的修改需要花费比较长的时间,有所不值!...

2019-05-19 00:34:34 119

原创 AFNetworking框架详解

AFHTTPSessionManager类初始化- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration { self = [super init]; if (!self) { return nil; } // 设置初始化N...

2019-04-28 20:55:52 1600

原创 NSURLConnection与NSURLSession简单使用

iOS9.0之前,网络请求都是通过NSURLConnection来获取远程服务器数据,iOS9.0之后苹果已弃用了NSURLConnection,使用了NSURLSession来替代之,功能强大的NSURLSession让我们获取数据更加得心应手!NSURLConnection发送请求方式 NSURLRequest* request = [NSURLRequest requ...

2019-04-17 14:07:06 553

原创 SDWebImage源码解析

SDWebImage已经在iOS开发中被广泛使用,提供了UIImageView和UIButton的分类,解决了需要从网络上加载图片的烦恼。SDWebImage的强大之处不仅在于提供图片的下载,还提供了图片的解码,超大图片的按比例解码,图片的缓存及内存占用超额的清理等功能!流程图上面是SDWebImage主要对图片下载、处理、解压、存储等功能的主要类功能分布,接下来我们来依次解析每个步骤...

2019-04-10 10:50:55 368

原创 HTTPS协议:叫个外卖咋这么复杂呢

前言最近爱上了研究第三方框架,感觉需要用框架来虐虐自己以涨涨姿势,导致最近老是感觉脑子不够用,哈哈哈,不过每次从懵懂到烧脑直到最后的理解,让人又爱又恨,这个过程也被网上的一些文章所误导,所以希望写下此文章帮助小伙伴更容易地去理解,哈哈哈!!简述HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的H...

2019-04-08 23:13:06 304

原创 苹果证书机制问题

非对称加密百度百科:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用...

2019-03-30 13:53:09 390

原创 Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage

Guideline 5.1.1 - Legal - Privacy - Data Collection and StorageWe noticed that your app requests the user’s consent to access their camera, photos, microphone, and location but does not clarify the...

2019-03-25 21:32:57 719

原创 HTTP缓存

本文内容引用自《HTTP权威指南》之缓存详解,我对文章做了粗略的概括!原理所有的缓存都是基于一套规则来帮助他们决定什么时候使用缓存中的副本提供服务(假设有副本可用的情况下,未被销毁回收或者未被删除修改)。把GET请求获取到的缓存保存在本地,可在下次请求时判断缓存是否过期来进行选择使用,对服务器请求资源进行了优化,也对请求资源数据减少时间。实现1、简述实现:客户端请求一个页...

2019-03-25 21:31:28 123

原创 HTTP报文

HTTP报文引发地思考:报文是如何流动的; HTTP报文的三个组成部分;(起始行、首部、实体的主体部分) 请求和响应报文的区别; 请求报文支持的各种方法; 和响应报文一起返回的状态码; 各种各样的HTTP首部都是用来做什么的;报文报文流是HTTP应用程序之间发送的数据块。这些数据块是以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分; 报...

2019-03-21 10:23:06 143

原创 与哈希表有关

本质哈希表本质其实是数组,它是通过关键码值而直接进行访问的数据结构。将key映射到数组中所对应位置,已便于对数组中的值进行快速查找,这个映射函数就是散列函数,这个存放数组即为散列表; 哈希表存放时其实是通过哈希函数将key转为整型数,再通过数组的长度进行取余,得到key在数组中所对应的位置address,将value值存放在address对应的位置处。 哈希表读取时是通过哈希函数将key转...

2019-03-14 16:50:24 111

原创 MJExtension原理分析

MJExtension简述MJExtension是一个非常容易使用并且功能强大的第三方框架,用于模型(model)与JSON之间进行相互转化!帮助开发者可高效方便地进行数据格式的转换,大大节省了开发者的开发时间。而且开发者也可以进行自定义转换模型字段或者忽略某些需转换的字段等,一旦你的项目用上将会爱不释手!预热宏#define MJExtensionAssertErro...

2019-03-11 14:46:05 765

原创 SVProgressHUD框架解析

SVProgressHUD框架的简单易用让他深受多数开发者的青睐,在github上获得了11.5k个小星星!这个框架提供了获取数据时添加加载提示遮罩,获取数据加载完成时显示成功,亦或数据获取失败时的遮罩提示。演示效果代码结构 SVIndefiniteAnimatedView实现- (CAShapeLayer*)indefiniteAnimatedLayer { ...

2019-02-25 15:43:00 706

原创 GCD死锁之你过来啊

死锁 概念 百度百科:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程 水手理解:线程中存在两个执行的任务A和B,任务A需要任务B执行完成才能往下执行,任务B需要任务A完成执行并返回也才能往下执行,所以导致两个任务互相等待使程序无法继续执...

2019-02-19 09:15:53 165

原创 dispatch_semaphore_t合理并发控制

当我们合理地使用GCD,无疑将给我们带来巨大的好处!我们也知道GCD给我们带来方便地同时,它所开启的线程个数却是无法通过提供地函数进行有效控制,若是多线程开发中我们即想使用GCD,又想合理地控制线程个数,使程序高效运行,此时我们想到了dispatch_semaphore_t!!在GCD中有三个函数是semaphore的操作,分别是:dispatch_semaphore_create创建信号...

2019-02-16 16:25:22 478

原创 GCD函数基本使用

串行(Serial)任务只能一个个按顺序执行,只能等到上一个任务执行完毕,才能执行当前的任务;并发 (Concurrent):任务不按顺序执行,不用等待上一个任务执行完,多个任务是同时执行的;在异步情况下可开启多个线程执行任务;同步(Synchronous):不具备开启新线程的能力; 任务执行完才返回; 同步函数: dispatch_sync();异步 (Asynchro...

2019-02-16 00:10:21 1799

原创 GCD简单原理

dispatch_queueGCD队列的获取通常有以下几种方式:主队列:dispatch_get_main_queue实际上是一个宏,它返回的是结构体_dispatch_main_q的地址; 管理队列:_dispatch_mgr_q是管理队列,不对外公开,只在GCD内部使用; 全局队列:dispatch_get_global_queue获取GCD内部定义的6个不同的全局队列,dq_wid...

2019-02-13 11:09:03 800

原创 单例模式与多线程

单例程序在运行过程中,保证类只生成一个实例,方便外界使用及节约系统资源。优点:单例模式可以保证系统中一个类生成实例地唯一性方便外界访问; 单例模式因为类控制了实例化过程,所以类可以更加灵活修改实例化过程;缺点:单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,直到退出程序内存才会被系统所回收; 单例不适用于变化的对象,同一类型的对象在不同的用例场景发生变化...

2019-02-04 20:42:33 255

原创 进程与线程

进程进程具有独立的内存地址空间,是独立的程序; 进程是计算机资源分配和调度的独立单元。线程线程是进程的实体,是CPU分派和调度的基本单元; 不拥有自己独立的系统资源空间,只有运行时必不可少的栈空间资源(如程序计数器、一组寄存器和栈); 与进程中的其它线程共享内存空间; 一个线程可以撤销另一个线程,可实现程序并发执行。区别进程拥有独立的系统资源,线程没有; 一个进程崩溃不会对其它...

2019-01-23 22:17:06 77

原创 Block五道题

闲聊前面说到编译器会帮助完成一些 Block 的 copy,也有手动 copy Block。那么 Block 被复制到堆上的情况有(此段摘自于『Objective-C高级编程 iOS与OS X多线程和内存管理』),对于这段话我觉得有必要说说:调用 Block 的 copy 方法时 Block 作为返回值时 将 Block 赋值给附有 __strong 修饰符的成员变量时(id类型或 Bl...

2019-01-17 22:17:18 202

原创 Block原理

通过这篇文章,可以让小伙伴能理解Block的使用及注意细节,也让Block代码块在开发中运用得更加恰到好处,本人通过自己的理解来讲解这篇文章,若有错误,欢迎指正!一、原理typedef void(^myBlock)(void);myBlock block = ^{ printf("helloWorld");};block();我们将代码转换为C++源码来进行详细地分析...

2019-01-13 22:10:09 114

原创 AutoreleasePool源码分析

现在我们已经进入了ARC时代,编译器帮我们在编译代码时自动对变量进行内存管理,使开发者不用再为了对象因为内存管理问题而头疼。AutoreleasePool是自动释放池,当我们在使用@autoreleasepool块时,自动释放池将会对池内对象进行管理,直到变量不被使用时,将其内存进行回收。一、调用源码struct __AtAutoreleasePool { __AtAutorelea...

2018-12-31 00:18:49 316

原创 iOS自动引用计数

引用计数:顾名思义,就是对象当前被引用的计数retainCount。当retainCount为0时,表面当前对象没有被任何其它对象引用;当retainCount不为0时,则对象任被系统中其它对象所引用,所以此时对象还仍被使用中,内存不能被系统所回收。只用当retainCount为0时,对象才能被系统所回收。生成对象的引用计数规则:自己生成的对象,自己持有。 非自己生成的对象,自己也能持有...

2018-12-24 22:15:05 468

原创 从NSObject开始了解isa

几乎所有的类都是继承自NSObject开始实现的,所有这篇文章我们也将从NSObject类开始来了解对象的创建及isa,文章也将从runtime源码开始让读者了解isa究竟是什么东西。一:对象分解NSObject* object = [[NSObject alloc] init];NSObject* object = (((id)((NSObject *(*)(id, SEL))(v...

2018-12-19 23:13:55 238

原创 Tagged Pointer作用

Tagged Pointer是苹果在 64 位架构下为了提升系统数据处理及执行效率,提出来的新概念。提出的原因是当在32位架构下,假设一个整型在32位系统下占4位,到了64位系统下将会占8位,既是内存翻了一倍;所以如果是一个占8位内存的指针,到了64位系统下占用内存也将是翻一番。所以苹果从内存和效率方面进行了考虑,使用了Tagged Pointer进行了优化,使得NSNumber、NSDate这类...

2018-12-13 23:36:01 159

原创 __weak与__block的使用

一、缘由有时候会因为循环引用导致对象无法释放时,会导致内存泄漏问题,使程序内存无法及时释放而内存增加。有时候我们想在block块中修改外部变量或者对象的值或属性,这些问题和需求使我们不得不去想办法更好地解决,这个时候我们会想到的是使用__weak和__block进行修饰。二、block定义在进行__weak和__block使用之前,我们先来对block块的基本定义回味一下,让接下来阅读...

2018-12-09 15:14:41 952

原创 KMNavigationBarTransition框架解析

KMNavigationBarTransition是美团开发的专为定制UINavigationBar的样式,在不同的控制器中实现UINavigationBar不同地样式,使每个控制器实现我们想要的效果。框架结构图:框架原理:pushController时:disappearingViewController即将消失时,若存在动画,则将系统的Bar隐藏,重新生成一个新的Bar;...

2018-11-28 10:51:33 1683

原创 iOS转场类

当开发中切换控制器时的默认执行的动画效果无法满足我们日常需求,我们则可以通过实现自定义想要的动画效果。一、转场动画相关类1.  动画控制器 (Animation Controllers) 遵从 UIViewControllerAnimatedTransitioning 协议,并且负责实际执行动画。可实现以下代码执行动画。- (NSTimeInterval)transitionDura...

2018-11-26 22:47:04 118

原创 UINavigationBar的结构分析

自从iOS11以后,苹果X的出现,导致UINavigationBar也出现了比较大的变化,刘海的出现让开发人员需重新进行适配,爽歪歪。下面先从UINavigationBar的外观进行讲解。以上是X的外观,下面我们对UINavigationBar的结构做下简单的分析:一、translucent为半透明的情况下:结构分析:_UIBarBackground相当于是UINavigati...

2018-11-21 15:49:34 763

原创 iOS 加载xib

概念:xib 是 Interface Builder 的图形界面设计文档,本质是XML文本文件,可以很方便的编辑。同时xib可以编译为nib。加载方式:1、加载xxxView.xib的文件:/** 第一种加载View类型的xib方式 **/UINib* nib = [UINib nibWithNibName:@"OneView" bundle:nil];NSArray* ...

2018-11-04 17:55:32 1034

原创 iOS runtime消息转发机制

1、概念:当消息的接受者找不到对应的方法selector,就会启动消息转发机制。2、消息转发机制分为三步:1、动态方法解析2、备用接受者3、完整消息转发3、详解:第一步:通过调用+ (BOOL)resolveInstanceMethod:(SEL)sel或者+ (BOOL)resolveClassMethod:(SEL)sel看是否对消息转发进行处理,若这一步对消息进行...

2018-10-10 17:08:30 275

原创 KVC与KVO

一、KVC1、概念:KVC是键值编码,即NSKeyValueCoding。我们可以通过以字符串为Key对对象属性进行操作。/** 通过传入字符串key获取或者设置类属性 **/- (nullable id)valueForKey:(NSString *)key;- (void)setValue:(nullable id)value forKey:(NSString *)key;...

2018-09-28 16:13:58 433

原创 OC开发建议之分类与扩展

一、分类分类,也叫类别Category。是在不改变原有类的基础上,对类功能进行扩展。当然也可以定义属性,只不过属性默认不生成set与get方法,需自己手动实现。这里有个需要注意的地方是分类不能生成成员变量,否则编译器会报错!不过一般不建议在分类中定义属性,毕竟分类还是在于扩展类的功能,而不在于处理数据!1.通过生成全局变量实现/** UIView+Category.h **/@i...

2018-09-21 16:26:56 244

原创 iOS深复制与浅复制

一、概念:浅复制,也有人称做浅拷贝。就是只改变新对象的指针指向,并未生成新的内存地址,只是将新对象的指针指向要复制对象的内存地址。集合类与非集合类执行copy操作都是浅复制。深复制,同样也有人称做深拷贝。即改变新对象指针指向,还为对象生成新的内存地址。深复制又分为单层深复制与完全深复制,单层深复制虽然生成了新的内存地址,但是新的对象中的元素地址还是旧对象元素的地址;完全深复制就不一样了,不...

2018-09-18 22:27:05 186

原创 NSSet和NSMutableSet基本用法

一、概念名称为集合,存放着不可重复对象的集合,集合中对象是无序的。二、NSSet基本用法// 初始化集合的几种方式NSSet* setArray = [NSSet setWithArray:@[@"mm", @"jj", @"zz"]];NSSet* setObject = [NSSet setWithObject:@"hello"];NSSet* setObjects = [...

2018-09-15 21:18:25 279

空空如也

空空如也

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

TA关注的人

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