-
iOS底层(2)-Category类别 & 关联对象
Category分类在编译的时候变成category_t 结构体,其中包含所有方法,协议,属性等。运行的时候把Category数组合并到Class的大数组中,后面参与编译的在数组的前面,也解释了为什么类别能够覆盖主类的方法,因为在方法查找时先找到类别的方法而已。 +laod()是在app启动时加载类、分类的时候调用。调用原理与普通的category方法不同,是直接按照主类,类别的方法调用专门存取load方法的指针来调用load方法,即调用顺序一定是主类,分类1,分类2。。。而且如果父类还...…
-
iOS底层(1)-Class & isa
类初始化内存分配NSObject占用内存大小为16个字节,但是NSObjct只有一个属性就是isa只占用8个字节,由于底层设计原因最少需要16个字节。结构体内存对齐,(x+7)& ~x 是将x按照8字节对齐。不满8就补齐8字节malloc 中的内存分配也会有内存对齐规则,mac中是16的倍数,如果传入只需要24字节,alloc后系统会分配32个字节空间即内存对齐。 class_getInstanceSize 返回的是对象需要的内存, NSObjcet中的isa占用8, 加上继承来的...…
-
JSBridge实现原理
什么是JSBridge由于Native和H5的各自特性,尤其的H5的易于部署的适用与双端的特点,使得为了满足业务的需要,公司实际项目的开发过程中往往会融合两者进行 Hybrid 开发。JSBridge 是一种 JS 实现的 Bridge,连接着桥两端的 Native 和 H5。它在 APP 内方便地让 Native 调用 JS,JS 调用 Native ,是双向通信的通道。为什么要做JSBridge我们知道OC调用JS的方法可以通过Webview的evaluateJavaScript:co...…
-
LeetCode刷题笔记
链表和数组多见链表的全反转,K个一组反转链表 head 等表示指定Node,不是index也不是指针 head.next = node1 表示该Node的后继节点是node1 node2 = node1.next, 表示将node1的后继节点node赋值给 node20. 交换链表节点剑指 Offer 反转链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。输入: 1->2->3->4->5->NULL输出: 5->...…
-
iOS 应用启动耗时分析及优化
iOS 应用启动耗时分析及优化App启动流程 main函数之前 1.iOS系统首先会加载解析该APP的Info.plist文件,因为Info.plist文件中包含了支持APP加载运行所需要的众多Key,value配置信息,例如APP的运行条件(Required device capabilities),是否全屏,APP启动图信息等。 2.创建沙盒(iOS8后,每次启动APP都会生成一个新的沙盒路径) ...…
-
Mach-O文件初识
Mach-o 文件 Mach-O格式全称为Mach Object文件格式的缩写,是mac上可执行文件的格式Mach-O 文件构成如下Headers保存了一些基本信息,包括了该文件运行的平台、文件类型、LoadCommands的个数等等。Headers的主要作用就是帮助系统迅速的定位Mach-O文件的运行环境,文件类型,保存了一些dyld重要的加载参数。Mach-O 文件的头部定义如下: magic 标志符 0xfeedface 是 32 位, 0xfeedfacf 是 64 位。 c...…
-
iOS高级面试题(超全)
OC1.BlockBlock的本质是什么?block本质是对象,底层是用结构体struct实现Block对应的数据结构是什么样子的?struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(void *dst, void *src); void (*dispose)(void *);};struct Block_layout { void...…
-
CoreAnimation详解
1. 图层树CALayer 是存在于UIView中的一种平行的层级关系2.寄宿图contens 属性可以给layer赋值CGImagecontentsGravity属性类似contentModel:kCAGravityResizeAspectcontentsScale属性用来设置渲染倍数 contentsRect用来显示contents中指定区域,适用于雪碧图的展示// 裁剪并显示雪碧图,不用从内存中读多张图片,4张图片在一张雪碧图中- (void)addSpriteImage:(UIIm...…
-
深入理解HTTPS
WhatHTTPS在传统的HTTP和TCP之间加了一层用于加密解密的SSL/TLS层(安全套接层Secure Sockets Layer/安全传输层Transport Layer Security)层。使用HTTPS必须要有一套自己的数字证书(包含公钥和私钥)。WhyHTTP的问题 不加密,通信是明文,可能被窃听 无法证明报文的完整性,可能被篡改 没验证通信方的身份,可能遭遇中间人伪装HTTPS解决的问题 信息加密传输:第三方无法窃听; 校验机制:一旦被篡改,通信双方会立刻发现;...…
-
WebRTC架构及原理
架构主体包含3个模块,音频引擎,视频引擎,传输层。最核心的在于传输层。 音频引擎包含回声消除,降噪音频编解码等。音频采集和渲染层 可override自己实现 视频引擎包含VP8,VP9,H264编解码,图形增强的算法。视频采集层 可override自己实现,不包含图像渲染层 传输层包含P2P,STUN,TURN,ICE,RTP,RTSP等传输控制协议。网络IO层可override 自己实现信令服务器NAT穿越: 设备大多在网关背后,想要简历P2P连接就要穿过网关,连接到内网的设备,...…
-
GCC 拥塞控制算法详解
GCC 拥塞控制算法谷歌使用GCC (Google Congestion Control ) 在 WebRTC中的拥塞控制算法,包含2个部分,一个是基于丢包的用拥塞控制,一个是基于延迟的拥塞控制。最终基于丢包的码率估计值和基于延迟的码率估计值做比较,使用最小的码率估计值作为最终发送码率。早期实现中2部分分别在发送端和接收端实现,接收端实现延迟梯度算法计算出估计带宽,反馈给发送端,发送端再根据2个算法结果确定最终发送码率。最近的WebRTC中的GCC都在发送端来实现,所以需要接收端在RTCP...…
-
BBR 拥塞控制算法详解
BBR 拥塞控制算法BBR: Bottleneck Bandwidth and RTTBBR 发明的目的是解决2个问题。 在有一定丢包率的网络链路上充分利用带宽 降低网络链路上的buffer占用率,降低延迟。BBR 原理 使用极大带宽和极小延迟的乘积作为发送窗口大小。其他拥塞算法原理所有拥塞算法目标都是最大化利用网络上瓶颈链路的带宽,通常办法是不断增加数据量,直到发生丢包或者延迟增大等这些信号表明当前带宽已经使用100%。GCC等其他算法都是基于某些信号认为网络发生拥塞,例如丢包。网络...…
-
TCP相关控制算法详解
TCP相关控制算法以段为单位发送数据在TCP建立连接三次握手的时候,协议中带有自己接口最适合的MSS (Maximum Segment Size)大小,发送方以后就按照这个大写切分数据段。滑动窗口来提高传输速度原先发送方每发送一条数据,都要等待接收方的反馈才会发送下一条,这样效率太低。现在定义一个窗口大小,每次发送窗口大小内数据不等待反馈,全部发送完毕等待一次反馈,相比原来节约很多时。滑动窗口与重发机制在使用窗口控制中,出现段丢失或者应答丢失会不会出发重传? 数据应答丢失 ...…
-
SIG蓝牙协议5.2版本更新内容
主要是3块新特性 Enhanced Attribute Protocol LE Power Control LE Isochronous Channels背景介绍PUD: Protocol Data Unit 协议数据单元 被某一层处理为指定数据格式的数据。SDU: Service Data Unit 服务数据单元 在某一层中还未处理的数据,比如输入的数据,叫SDU,封装成PDU通过层与层之间的管道传输给下一层。本层的PDU是下一层的SDU,本层的SDU是上一层的PDU一、Enhan...…
-
蓝牙协议栈
协议栈内容PHY层Physical layer 用来指定BLE所用的无线频段,调试解调方式和方法等。LL层link layer 是协议栈的核心,选择使用哪个射频通道进行通信,怎么识别inflight数据包,在哪个时间点发送数据包,哪个时间点接收数据包,怎么保证数据完整性,ACK接收,如何重传,链路管理控制等。HCI层Host controller interface HCI是可选的,主要用于2颗芯片实现BLE协议栈的场合,规范两者之间的通信协议和通信命令等GAP层Generic acce...…
-
在腾讯云上搭建jekyll静态博客
本文旨在帮助小伙伴在腾讯云或阿里云上搭建jekyll环境,有错误还请指正。对于一个全新服务器,需要从新开始配置相关依赖环境。安装 Nodejs 环境$ wget https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.xz$ xz -d node-v8.12.0-linux-x64.tar.xz$ tar -xf node-v8.12.0-linux-x64.tar $ ln -s ~/node-v8.12.0-linux-x6...…
-
Flutter渲染机制—UI线程(四)
四、Framework层绘制在引擎层的处理过程会调用到window.onBeginFrame()和onDrawFrame,回到framework层从这个两个方法开始说起。4.1 SchedulerBinding.initInstances[-> lib/src/scheduler/binding.dart:: SchedulerBinding]mixin SchedulerBinding on BindingBase, ServicesBinding { @override vo...…
-
Flutter渲染机制—UI线程(三)
三、Engine层绘制3.1 doFrame[-> Choreographer.java]public void doFrame(long frameTimeNanos) { //Android FW每次当vsync信号触发,则会调用该方法 [见下方] nativeOnVsync(frameTimeNanos, frameTimeNanos + refreshPeriodNanos, cookie);}Vsync注册过程见[小节2.6] Choreographer.Fra...…
-
Flutter渲染机制—UI线程(二)
二、 VSYNC注册流程2.1 Engine::ScheduleFrame[-> flutter/shell/common/engine.cc]void Engine::ScheduleFrame(bool regenerate_layer_tree) { //[见小节2.2] animator_->RequestFrame(regenerate_layer_tree);}该方法说明: animator_的赋值过程是在Engine对象初始化过程完成,而Engine...…
-
Flutter渲染机制—UI线程(一)
一、UI线程渲染Flutter是谷歌开源的移动UI框架,可以快速在Android和iOS上构建出高质量的原生用户界面,目前全世界越来越多的开发者加入到Flutter的队伍。 Flutter相比RN性能更好,由于Flutter自己实现了一套UI框架,丢弃了原生的UI框架,非常接近原生的体验。为了揭秘Flutter高性能,本文从源码角度来看看Flutter的渲染绘制机制,跟渲染直接相关的两个线程是UI线程和GPU线程: UI线程:运行着UI Task Runner,是Flutter Engi...…