自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(311)
  • 资源 (3)
  • 收藏
  • 关注

转载 async、await的基本用法

关键字和是Dart语言异步支持的一部分。

2022-06-21 18:08:21 1235

转载 对组件化与模块化的思考与总结

前言前段时间反复研读了蘑菇街 App 的组件化之路、蘑菇街 App 的组件化之路·续和iOS应用架构谈 组件化方案,然后又找到了其它一些研究组件化、模块化方案的文章,但是总觉得差点什么,所以还是决定从头开始思考。文章的标题起的好宽泛,感觉给自己挖了个深坑-。-,其实只是自己对组件化、模块化的一些看法、总结。为什么先总结下为什么要大动干戈的对代码分模块、拆组件。代码量膨胀,不利于维护,更不利于新功能的开发现在随便开发一个App的代码行数都是数以万计的,如果不对代码做合理的拆分,那简直就

2021-09-29 10:47:04 398

转载 iOS应用的启动流程和优化详解

一、应用启动流程1、整体过程(1)解析Info.plist加载相关信息,例如如闪屏 沙箱建立、权限检查(2)Mach-O(可执行文件)加载dylib loading time(动态库耗时) rebase/binding time(偏移修正/符号绑定耗时)rebase(偏移修正):任何一个app生成的二进制文件,在二进制文件内部所有的方法、函数调用,都有一个地址,这个地址是在当前二进制文件中的偏移地址。一旦在运行时刻(即运行到内存中),每次系统都会随机分配一个ASLR(Address

2021-09-07 17:41:35 777

原创 weak 实现原理的概括

Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象指针的地址)数组。weak 的实现原理可以概括一下三步:1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak() 的作用是更..

2021-09-03 11:18:22 178

转载 UI更新原理和卡顿原因

在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去,等待下一次 VSync 信号到来时显示到屏幕上。由于垂直同步的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显...

2021-07-21 17:15:44 335

转载 Class-Protocol Router

定义一个protocol,叫protocolB,让BViewController实现。protocolB里面可以定义BViewController创建时需要的参数,例如这里的name和age。@protocol ProtocolB <NSObject>- (void)setBViewControllerName:(NSString *)name age:(int)age;@endBViewController实现protocolB#import "Protoco

2021-07-16 16:31:49 164

原创 CTMediator原理总结

这两天看了下CTMediator这个中间件,网上说的文章很多,但没有比较具体的总结实现方式。其实这个是中介者模式的一种实现。其实这个CTMediator不光用来做路由,还可以用在不同模块,不同类之间通信,而且不会耦合,不会引入依赖。总结CTMediator是实现原理吧,假设现在有这样一个场景,A类要跳转到B类,并且传参数给B类。实现思路是:A与CTMediator交互,CTMediator与B交互。CTMediator通过NSInvocation做了最核心的消息触发、转发。首先.

2021-07-15 16:25:50 982

原创 constructor和load

constructor 和 +load 都是在 main 函数执行前调用,但 +load 比 constructor 更加早一丢丢,因为 dyld(动态链接器,程序的最初起点)在加载 image(可以理解成 Mach-O 文件)时会先通知 objc runtime 去加载其中所有的类,每加载一个类时,它的 +load 随之调用,全部加载完成后,dyld 才会调用这个 image 中所有的 constructor 方法。所以 constructor 是一个干坏事的绝佳时机:所有Class都已经加载完成

2021-07-14 15:01:04 174

转载 AssociationsManager

关联对象实际上是使用AssociationsManager这个全局变量的hashMap储存在内存中,并不是存储在关联对象的内存中:AssociationsManagerAssociationsHashMapObjectAssociationMapObjcAssociation关联对象的存储结构面试参考答案关联对象是线程安全的么?是线程安全的因为关联对象的值是储存在一个全局的AssociationsManager中的AssociationsHashMap hashM.

2021-07-13 11:17:13 373

转载 全网最透彻HTTPS(面试常问)

每篇文章都希望你能收获到东西,这篇将带你深入 HTTPS 加解密原理,希望看完能够有这些收获: 明白 HTTPS 到底解决了什么问题 理解对称加密与非对称加密的原理和使用场景 明白 CA 机构和根证书到底起了什么作用 Why HTTPS近几年来,各大公司都在大力推进 HTTPS 的建设。Google Chrome将非 HTTPS 的网站标注为「不安全」,苹果要求 APP 中需要使用HTTPS进行通信,微信小程序也要求使用HTTPS协议。那么,我们为什么非要做这么一件事呢?

2021-07-08 10:56:42 356

转载 page fault

由于虚拟内存的机制,应用启动时不会把所有数据加载到内存,而是以页为单位逐步从磁盘中加载,内存中的虚拟地址和磁盘中的物理地址有个映射关系。当程序执行时,如果发现要访问的东西不在内存里,就会触发一次page fault ,去磁盘中加载新的一页。启动阶段有很多方法要调用,而这些方法在Mach-O中的位置又是在编译时确认的。如果有10个方法刚好在不同页,可能就要产生10次page fault 。二进制重排要做的就是将启动阶段要用到的方法,在编译时提前确定,通过.order文件告诉编译器,这样这些方法会排布在

2021-06-30 17:04:21 620

原创 H5学习

CSS 选择方式1、#div 控件#divid p { color: #1FBDFF;}#divid h1 { color: #5FB878;}2、div#控件id,或者直接#控件iddiv#container{ color: #5FB878;}#container{ color: #5FB878;}

2021-04-13 17:11:45 83

原创 dyld

dyld 是启动的辅助程序,是 in-process 的,即启动的时候会把 dyld 加载到进程的地址空间里,然后把后续的启动过程交给 dyld。dyld 主要有两个版本:dyld2 和 dyld3。dyld2 是从 iOS 3.1 引入,一直持续到 iOS 12。dyld2 有个比较大的优化是dyld shared cache,什么是 shared cache 呢?shared cache 就是把系统库(UIKit 等)合成一个大的文件,提高加载性能的缓存文件。iOS 13 开始 Apple 对

2020-10-28 15:41:04 521

原创 关于bool,int类型变量使用atomic/nonatomic属性修饰的分析

原子性指一个或多个操作在CPU执行的过程不被中断的特性。原子性问题产生的源头是线程切换,而线程切换依赖于CPU中断。long 型变量是 64 位,在 32 位 CPU 上执行写操作会被拆分成两次写操作,写高 32 位和写低 32 位。64位机器上不会有这个问题。bool 只占一个字节 不会出现非原子操作。只要读写的内存长度小于等于地址总线的长度,那么读写的操作就是原子的。如果读写(load or store)的内存长度小于等于地址总线的长度,那么读写的操作是原子的,一次完成。比如bool,i.

2020-08-11 09:46:37 486

原创 attribute的理解

attribute 是编译器给符号关联的一些属性标记,编译器/链接器可以根据这些标记,产生特定的行为原理就是让编译器帮你生成一些代码比如 availability 属性,读到这个标记,编译器就可以给你提供版本兼容的警告再比如 always_inline 属性,读到这个标记,代码生成阶段就会强制内联实现 load 的是一个叫做 constructor 的属性,读到这个属性,链接器就会把这个函数加到 mod_init_funcs 里去load优先于attribute执行。...

2020-07-15 17:22:07 324

转载 swift-依赖倒置

面向对象开发中非常重要的一个原则,在大型的项目的开发中,通常都会采用分层的方式进行开发,即上层调用下层,上层依赖于下层,这样就是产生上层对下层的依赖。当下层设计产生变动时,上层代码也需要跟着做调整,这样会导致模块的复用性降低,这样大大的提高了开发成本。例如网络层面向对象编程中最大的优势在于起方便的对问题进行抽象,一般起概况下抽象层很少产生变化。依赖倒置原则的定义就是:高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。由于都对接口进行依赖,减少了类之间的耦合。

2020-07-14 16:33:47 171

原创 hashmap实现

hashmap里面有个数组(桶),数组中的保存的是双向链表或者红黑树。要保存一个值,通过hash函数求出索引,然后添加到这个链表上,如果链表过长或者hashmap中的元素过多,会进行扩容或者由链表进化成红黑树。取出元素也是一样的通过hash函数,求出索引,找到桶,然后通过key比较对比,找到对应的value。因为元素数量过多时会对数组进行扩容,所以复杂度是O1二分查找要求元素可以随机访问,所以决定了需要把元素存储在连续内存。这样查找确实很快,但是插入和删除元素的时候,为了保.

2020-06-03 11:07:38 523

转载 你真的理解__block修饰符的原理么?

你真的理解__block修饰符的原理么?————————————————版权声明:本文为CSDN博主「bestswifter」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/abc649395594/article/details/47086751...

2020-05-28 17:27:42 144

转载 iOS组件化中路由方案的分析

随着移动互联网的不断发展,用户的需求越来越多,对App的用户体验也变的越来越高。为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构。更换适合业务的架构,是为了后期能更好的维护项目。​但是用户依旧不满意,继续对开发人员提出了更多更高的要求,不仅需要高质量的用户体验,还要求更多的功能体验,如哔哩哔哩客户端从原有的视频观看的基础之上逐步...

2019-03-29 16:15:27 857

转载 什么是面向切面编程AOP?

作者:知乎用户链接:https://www.zhihu.com/question/24863332/answer/48376158来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件...

2019-03-22 17:03:34 197

原创 历代iPhone的分辨率

历代iPhone的分辨率设备 逻辑分辨率(point) 物理分辨率(pixel) 屏幕尺寸 缩放因子 PPI iPhone 2G 320 × 480 320 × 480 3.5寸 @1x 163 iPhone 3 320 × 480 320 × 480 3.5寸 @1x 163 iPhone ...

2018-09-30 10:50:46 4811

原创 优化点

1、代码架构重构,横向业务划分、纵向技术分层,底层的基础模块弄成私有库。2、引入路由机制进行页面、模块跳转3、采用MVVM模式拆分业务逻辑4、AppDelegate解耦5、页面CPU、加载速度、内存性能监控埋点6、接口响应速度、解析数据速度埋点7、网络请求、响应对象化8、网络获取接口自动重试与可配置9、网络响应数据缓存10、网络重复请求取消11、搜索结果在网...

2018-09-22 21:31:27 271 1

转载 总在说的AppDelegate瘦身的另外一种思路

前段时间整理项目中的AppDelegate,发现很多写在- application:didFinishLaunchingWithOptions:中的代码都只是为了在程序启动时获得一次调用机会,多为某些模块的初始化工作,如: - (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NS...

2018-08-21 14:49:24 859

转载 Objective-C 原子属性

Objective-C 在声明一个属性的时候,想必大家都是不用经过大脑思考就会写 @property (nonatomic, ...。我们都知道属性可以是 nonatomic 也可以使 atomic 的,但是好像几乎所有属性在声明的时候 nonatomic,atomic 的属性几乎没出现过。atomic 修饰符仿佛已被大家遗忘。实际上,如果声明属性时既不写 atomic 也不写 nonat...

2018-07-26 21:13:01 493

转载 避免使用 GCD Global队列创建Runloop常驻线程

避免使用 GCD Global队列创建Runloop常驻线程本文对应 Demo 以及 Markdown 文件在仓库中,文中的错误可以提 PR 到这个文件,我会及时更改。目录 避免使用 GCD Global队列创建Runloop常驻线程 GCD Global队列创建线程进行耗时操作的风险 避免使用 GCD Global 队列创建 Runloop 常驻线程 单一 Runlo...

2018-07-25 17:05:08 873

转载 iOS 统计打点那些事

统计打点是 App 开发里很重要的一个环节,App 的运行状态、改版后的效果、用户的各种行为等都需要打点,市面上也有不少可供选择的第三方库。 假设产品有这么个需求:当用户在详情页点击购买按钮时,记录一下事件。我们实现起来大概会是这样  1234567 // DetailViewController.m- (void)onBuyButto...

2018-07-24 21:11:58 862

转载 GCD使用经验与技巧浅谈

前言GCD(Grand Central Dispatch)可以说是Mac、iOS开发中的一大“利器”,本文就总结一些有关使用GCD的经验与技巧。dispatch_once_t必须是全局或static变量这一条算是“老生常谈”了,但我认为还是有必要强调一次,毕竟非全局或非static的dispatch_once_t变量在使用时会导致非常不好排查的bug,正确的如下: 12...

2018-07-24 17:55:27 275

转载 Objective-C的“多继承”——消息转发

当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承。多继承是从多余一个直接基类派生类的能力,可以更加直接地为应用程序建模。但是Objective-C不支持多继承,由于消息机制名字查找发生在运行时而非编译时,很难解决多个基类可能导致的二义性问题。不过其实 Objective-C 也无需支持多继承,我们可以找到如下几种间接实现多继承目的的方法:消息转发 delegate和prot...

2018-07-24 11:09:29 246

转载 深入理解Objective-C:Category

摘要无论一个类设计的多么完美,在未来的需求演进中,都有可能会碰到一些无法预测的情况。那怎么扩展已有的类呢?一般而言,继承和组合是不错的选择。但是在Objective-C 2.0中,又提供了category这个语言特性,可以动态地为已有类添加新行为。如今category已经遍布于Objective-C代码的各个角落,从Apple官方的framework到各个开源框架,从功能繁复的大型APP到简单的应...

2018-07-12 17:49:44 173

转载 深入浅出iOS事件机制

本文章将讲解有关iOS事件的传递机制,如有错误或者不同的见解,欢迎留言指出。iOS的事件有好几种:Touch Events(触摸事件)、Motion Events(运动事件,比如重力感应和摇一摇等)、Remote Events(远程事件,比如用耳机上得按键来控制手机),其中最常用的应该就是Touch Events了,基本存在于每个app的每个地方,今天我们主要就讲讲它,至于其他两个事件有兴趣的可以...

2018-07-10 21:08:27 149

转载 UIView的hitTest和pointInside方法

官方描述- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;Returns a Boolean value indicating whether the receiver contains the specified point.- (UIView *)hitTest:(CGPoint)point withEvent:(UIE...

2018-07-10 20:35:57 451

转载 iOS网络请求在Controller退出后是否应该被取消?

一个编写iOS代码的经典场景:用户进入某个Controller,发起Http网络请求从Server获取数据,在数据返回之前用户退出了Controller。此时是否需要Cancel之前发出的网络请求呢?如果请求的数据只在当前Controller产生内容,结论当然是需要Cancel,虽然我知道不少iOS程序员因为偷懒而忘了取消。我们用工程的思维,深入本质,一起看下这背后都发生了什么,如果不Cancel...

2018-07-10 16:40:38 1033

转载 深度优化iOS网络模块

几乎每一个讲究的iOS项目都会有一个「网络模块」,大部分的网络请求都是通过HTTP完成,使用成熟的第三方库诸如AFNetworking很容易搭建一个功能简易的网络模块。但这一模块要优化好却没那么简单,是个旷日持久的工作,笔者根据自己多年的“填坑”经验,总结一下深度优化iOS项目网络模块的方方面面,也给自己做下知识梳理。预热网络模块的接口设计不在本文讨论之列,设计思路有些偏个人口味,我只探讨一些可以...

2018-07-10 11:30:49 457

转载 iOS网络请求优化之DNS映射

iOS网络请求优化之DNS映射绝大多数网络请求的第一步都是DNS解析,解析请求根据当时网络情况不同,各平台的DNS缓存策略差异等因素,对移动端app整体网络性能会产生或大或小的影响。移动端app网络性能优化涉及到很多方面,DNS映射只是其中一环,也是十分重要的一环,因为它带来的好处不仅仅是降低网络请求的延迟。降低DNS请求带来的延迟客户端app的请求第一步都是DNS解析,但由于cache的存在使得...

2018-07-10 10:26:05 797

转载 Block&&Delegate

作者:黄兢成链接:https://www.zhihu.com/question/29023547/answer/109570584来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。block 和 delegate 都可以通知外面。block 更轻型,使用更简单,能够直接访问上下文,这样类中不需要存储临时数据,使用 block 的代码通常会在同一个地方,这样读代码也连贯。...

2018-07-09 11:27:41 147

原创 GCD中如何取消线程

       在iOS开发中,常用NSOperation和GCD来做多线程的开发,NSOperation有cancel可以取消还未执行的线程。但是没办法做到取消一个正在执行的线程。       GCD目前有两种方式可以取消线程,如下1、类似NSOperation一样,可以取消还未执行的线程。但是没办法做到取消一个正在执行的线程。可以取消还未执行的线程有两种方式:1.1 iOS8后采用提供的API,...

2018-07-07 10:24:54 3712

转载 教你如何取消GCD任务

  GCD 是一种非常方便的使用多线程的方式。通过使用 GCD,我们可以在确保尽量简单的语法的前提下进行灵活的多线程编程。在 “复杂必死” 的多线程编程中,保持简单就是避免错误的金科玉律。然而,GCD不像NSOperation那样可以调用 -(void)cancel 取消一个操作的执行(注意这里的取消只是针对未执行的任务设置finished = YES,如果这个操作已经在执行了,那么我们只能等其操...

2018-07-06 15:09:28 2848

原创 富文本拼接封装,包含空值处理。

    富文本的拼接经常要写一大串代码,有的时候还要拼接图片,才能达到效果,还容易搞错。如果有服务端返回的空值,还会造成程序crash。这里就进行了封装。包含了空值处理。NSAttributedString+AtrtributeText.h文件#import &lt;Foundation/Foundation.h&gt;@import UIKit;@interface NSAttributedSt...

2018-07-06 10:22:52 701

原创 TableView的headerView或者FooterView的高度问题

      在iOS开发中,经常碰到headerView或者FooterView的高度问题,headerveiew和footerView经常根据业务需求高度发生变化,需要调接口。要做到正确的高度,需要进行以下两个步骤:      1、重新设置tableview的headerView或者FooterView,即tableView.tableFooterView = FooterView或tableV...

2018-07-05 14:52:49 5619

转载 NSURLProtocol 全攻略

一位著名的iOS大神Mattt Thompson在http://nshipster.com/nsurlprotocol/ 博客里说过,说“NSURLProtocol is both the most obscure and the most powerful part of the URL Loading System.”NSURLProtocol是URL Loading System中功能最强大...

2018-07-02 19:56:57 2767

流媒体协议标准RTSP

流媒体协议标准RTSP,经典不用解释!

2012-04-22

H263协议中文版

H263协议中文版,讲解详细!

2012-04-22

华为内部培训SIP

华为内部培训用的SIP pdf 真的很经典的!

2012-04-22

空空如也

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

TA关注的人

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