7 Ansel_m

尚未进行身份认证

阿里天猫

等级
博文 993
排名 740

基于 clang 插件的一种 iOS 包大小瘦身方案

引子包瘦身,包瘦身,包瘦身,重要的事情说三遍。最近公司一款iOSAPP(本文只讨论使用ObjectiveC开发的iOS安装包)一直在瘦身,我们团队的APP也愈发庞大了。而要解决这个问题,思路主要集中在两个方向,资源和代码。资源主要在于图片,方法包括移除未被引用的图片,只使用一套图片(2x或3x),图片伸缩等;代码层面主要思路包括重构消除冗余,linkmap中s...

2019-06-27 10:53:15

otool 分析Mach-O

otool查看所有的Methodotool-v-s__TEXT__objc_methnamemach-o的pathotool查看被调用的Methodotool-v-s__DATA__objc_selrefsmach-o的pathotool查看所有的Classotool-v-s__TEXT__objc_classnamemac...

2019-06-18 15:24:58

iOS调优 | 深入理解Link Map File

LinkMapFile初识我们编写的源码需要经过编译、链接,最终生成一个可执行文件。在编译阶段,每个类会生成对应的.o文件(目标文件)。在链接阶段,会把.o文件和动态库链接在一起。LinkMapFile就是这样一个记录链接相关信息的纯文本文件,里面记录了可执行文件的路径、CPU架构、目标文件、符号等信息。为什么要理解LinkMapFile理解LinkMapFile,可以...

2019-06-18 10:57:12

分析Mach-O文件

OSX系统自带的otool可以分析Mach-O可执行文件类似命令行工具:jtool常用命令如下:查看fatheaders信息otool-fxxx.app/xxx$otool-fxxx.app/xxxFatheadersfat_magic0xcafebabenfat_arch2architecture0cputype12cpusubt...

2019-06-18 10:25:06

创建CocoaPods的制作过程

使用CocoaPods来管理第三方库实在是方便,在学会了使用CocoaPods后,开始尝试创建一个自己的版本依赖库,当然,迟早要走到这一步的.创建仓库接下来实现一个首页广告循环播放功能,项目名为CLRollingCycleView本地仓库使用Xcode创建一个CLRollingCycleView项目,项目并添加Classes(核心功能)远程仓库在github上同样创建...

2019-05-08 16:20:14

BFTask剖析

github:https://github.com/BoltsFramework/Bolts-ObjC

2019-04-14 22:41:35

图文翔解HashTree

在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。之前我们介绍的各种基于比较的树查找算法,这些查找算法的效率都将随着数据记录数的增长而下降。仅仅是有的比较慢(时间复杂度为O(n)),有的比较快(时间复杂度是O(logn))而已。这些查找算法的...

2019-04-10 10:39:50

mach-o文件分析

一.先给出一个结构图,大致了解一下内部的结构:image.png主要结构分成三个部分: Header部分:保存了该文件的一些基本信息,如平台,文件类型,加载命令的个数等 loadCommends部分:根据这里的数据来确定内存的分布 Data部分:存放具体的代码和数据 data部分是以段来划分的,segment段类型如下图: 1:__PAGEZERO段:...

2019-04-07 13:33:42

block的变量捕获

先了解一下block的本质1.block本质上也是一个OC对象,它内部也有个isa指针2.block是封装了函数调用以及函数调用环境的OC对象3.block的底层结构如下图所示为了保证block内部能够正常访问外部的变量,block有个变量捕获机制 变量类型 捕获到block内部 访问方式 局部变...

2019-03-31 13:25:35

+load方法和+initialize方法的调用

一.load方法1.+load方法会在runtime加载类、分类时调用2.每个类、分类的+load,在程序运行过程中只调用一次3.调用顺序3.1先调用类的+load,按照编译先后顺序调用(先编译,先调用)3.2调用子类的+load之前会先调用父类的+load3.3.再调用分类的+load,按照编译先后顺序调用(先编译,先调用)4.直接拿IMP执行load方...

2019-03-30 23:50:33

KVC

1.setValue:forKey:的原理setValue:forKey:的原理注意:直接给成员变量赋值是不会触发KVO,但是通过KVC修改成员变量是会触发KVO2.valueForKey:的原理...

2019-03-30 17:28:06

跳跃表原理

最近看了一种数据结构叫做skipList,redis和levelDB都是用了它。SkipList是在有序链表的基础上进行了扩展,解决了有序链表结构查找特定值困难的问题,查找特定值的时间复杂度为O(logn),他是一种可以代替平衡树的数据结构。下面是skipList的一个介绍,转载来的,源地址:http://kenby.iteye.com/blog/1187303,为防止...

2019-03-29 10:36:29

Dijkstra 最短路算法

上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”。本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径。与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下。我们还需要用一个一...

2019-03-26 10:40:06

Bellman-Ford 单源最短路径算法

Bellman-Ford算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-SourceShortestPath)的算法。该算法由RichardBellman和LesterFord分别发表于1958年和1956年,而实际上EdwardF.Moore也在1957年发布了相同的算法,因此,此算法也常被称为Bellman-Ford-Moore算法...

2019-03-26 10:15:42

dijkstra算法:寻找到全图各点的最短路径

dijkstra算法介绍:即迪杰斯特拉算法,是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止,是一种广度优先的搜索方法。dijkstra算法原理:最优子路径存在。假设从S→E存在一条最短路径SE,且该路径经过点A,那么可以确定SA子路径一定是S→A的最短路径。证明:反证法。如果子路径SA不是最短的,那么就必...

2019-03-22 11:42:31

最小生成树-Prim算法

Prim算法1.概览普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex(graphtheory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:VojtěchJarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英...

2019-03-21 13:15:38

最通俗易懂的01背包问题讲解

1、动态规划(DP)  动态规划(DynamicProgramming,DP)与分治区别在于划分的子问题是有重叠的,解过程中对于重叠的部分只要求解一次,记录下结果,其他子问题直接使用即可,减少了重复计算过程。  另外,DP在求解一个问题最优解的时候,不是固定的计算合并某些子问题的解,而是根据各子问题的解的情况选择其中最优的。  动态规划求解具有以下的性质:  最优子结构性质、子问题...

2019-03-21 11:48:06

(七)图的邻接多重表存储法(超详细)

前面讲过,无向图的存储可以使用邻接表,但在实际使用时,如果想对图中某顶点进行实操(修改或删除),由于邻接表中存储该顶点的节点有两个,因此需要操作两个节点。为了提高在无向图中操作顶点的效率,本节学习一种新的适用于存储无向图的方法——邻接多重表。注意,邻接多重表仅适用于存储无向图或无向网。邻接多重表存储无向图的方式,可看作是邻接表和十字链表的结合。同邻接表和十字链表存储图的方法相同,都是独自...

2019-03-20 18:56:46

(六)图的十字链表存储法详解

与邻接表不同,十字链表法仅适用于存储有向图和有向网。不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题。十字链表存储有向图(网)的方式与邻接表有一些相同,都以图(网)中各顶点为首元节点建立多条链表,同时为了便于管理,还将所有链表的首元节点存储到同一数组(或链表)中。其中,建立个各个链表中用于存储顶点的首元节点结构如图1所示:图1十字链表中首元节点结构示意图从图1可...

2019-03-20 16:46:51

(五)图的邻接表存储法详解

通常,图更多的是采用链表存储,具体的存储方法有3种,分别是邻接表、邻接多重表和十字链表。本节先讲解图的邻接表存储法。邻接表既适用于存储无向图,也适用于存储有向图。在具体讲解邻接表存储图的实现方法之前,先普及一个"邻接点"的概念。在图中,如果两个点相互连通,即通过其中一个顶点,可直接找到另一个顶点,则称它们互为邻接点。邻接指的是图中顶点之间有边或者弧的存在。邻接表存储图的实现方式是,...

2019-03-18 11:49:59
奖章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得