自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 资源 (2)
  • 收藏
  • 关注

原创 iOS进阶 - GCD总结

详细清晰的关于 GCD 的总结:GCD 任务和队列、 GCD 的使用步骤、GCD 的基本使用(六种组合不同区别,队列嵌套情况区别,相互关系形象理解)、GCD 线程间的通信、GCD 的其他方法(栅栏方法等)

2021-01-26 17:18:56 215 3

原创 Swift进阶 - 目录

Swift 进阶目录

2022-01-08 16:45:28 1536

原创 iOS底层 - 符号解析(dSYM & 系统符号)Go语言版本

前言由于业务发展需要,公司自建了APM系统,考虑到性能问题,需要在Linux服务器上解析dSYM及系统库符号,于是便写了一个Go版本的atos工具。dSYM解析这里不做解释,直接请看源码系统符号提取符号1.下载ipsw 文件ipsw 固件下载地址:Firmware/iPhone选择对应的版本包,例如注意区分架构arm64/arm64e!!!(iPhoneXR之后的设备为arm64e架构)2. 安装解析工具安装解析命令工具 ipsw , 参考:In...

2021-12-29 09:53:21 3767 23

原创 相遇问题 - 时针与分针

问题时钟的时针分针每天重叠几次?什么时候重叠?解答分针比时针速度快,都做匀速圆周运动,所以分针可以周期性地赶上时针。不妨把屏幕分成60格(每两个数字之间5格)。分针的速度v1 = 1格/分钟时针的速度v2 = (1/12)格/分钟设经时间t两针相遇,得出:v1*t - v2*t = 60N (N = 0,1,2……)以上算式可得出 t= (720/11)N ,即他们每格65又5/11分钟相遇一次,总的相遇次数:24*60/(720/11)=22次...

2021-12-28 17:23:14 1037 7

原创 哈希表 - 解决哈希冲突(总结)

什么是哈希表哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过关键码映射的位置去寻找存放值的地方。举例说明:新华字典中,获取“按”字详细信息,需要根据拼音an去查找拼音索引(当然也可以是偏旁索引),我们首先去查an在字典的位置,查了一下得到“安”。这过程就是键码映射,在公式里面,就是通过key去查找f(key)。其中,按就是关键字(key),f()就是字典索引,也就是哈希函数,查到的页码就是哈希值。一个好的哈希函数需要有以下特点:尽量使关键字对应的记录均匀分配在哈希表里面 关键字极小

2021-12-28 16:39:46 3498 3

原创 性能对比 - 数组、单链表、双链表

总结数组与链表区别

2021-12-28 11:34:04 1060 4

原创 缓存算法 - FIFO、LFU、LRU(思路梳理)

前言FIFO 核心原则:如果一个数据最先进入缓存中,则应该最早淘汰掉。LFU核心原则:如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小。LRU核心原则:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。FIFO(First in First out)需求分析get(key):如果Cache中存在该key,则返回对应的value值,否则,返回-1。set(key,value):如果Cache中存在该key,则重置value值;如果..

2021-12-28 10:40:44 938 1

原创 链表 - 单链表翻转(常见的四种方案)

前言所谓反转链表,就是将链表整体“反过来”,将头变成尾、尾变成头。那么,如何实现链表的反转呢?反转前:图 1 未反转的链表反转后:图 2 反转后的链表常用的实现方案有 4 种,这里分别将它们称为迭代反转法、递归反转法、就地逆置法和头插法。递归反转法更适用于反转不带头节点的链表;其它 3 种方法既能反转不带头节点的链表,也能反转带头节点的链表。本文以不带头节点的链表为例,给大家详细讲解各算法的实现思想。方案1:迭代反转链表该算法的实现思想非常直接,就是从当前链表的首

2021-12-27 23:21:16 1879 1

原创 链表 - 单链表中的环

前言关于单链表,有一些很经典的问题,在这里梳理一下(假设链表头指针为head)问题给一个单链表,判断其中是否有环的存在? 如果存在环,找出环的入口点? 如果存在环,求出环上节点的个数? 如果存在环,求出链表的长度? 如果存在环,求出环上距离任意一个节点最远的点(对面节点)? 如何判断两个无环链表是否相交? 如果两个无环链表相交,求出第一个相交的节点?解答【问题1】给一个单链表(链表头指针为head),判断其中是否有环的存在?采用“快慢指针”的方法,即创建两个指针fast和s

2021-12-27 17:58:57 699 1

原创 iOS底层 - Block实现原理

Block的底层基本结构void blockTest(){ void (^block)(void) = ^{ NSLog(@"Hello World!"); }; block();}int main(int argc, char * argv[]) { @autoreleasepool { blockTest(); }}通过clang命令查看编译器是如何实现Block的,在终端输入XCRun -sdk iphone.

2021-01-29 10:07:01 1089 4

原创 iOS基础 - Block变量截获(总结)

一、局部变量截获是 “值截获” NSInteger number = 30; NSInteger(^block)(NSInteger) = ^NSInteger(NSInteger n){ return n + number; }; num = 5; NSLog(@"%zd", block(10));这里输出结果是 40,而不是 15,原因是对局部变量 number 的截获是 “值截获”。在 bl

2021-01-28 14:40:33 1118 6

原创 iOS进阶 - pod install 与 pod update 读这一篇就够了

很多人使用CocoaPods时往往认为pod install只是在首次配置项目的时候使用的,而pod update是稍后更新库的时候使用的。但是事实并非如此。这篇文章的目的是阐述清楚什么时候使用pod install命令,什么时候使用pod update命令。

2021-01-26 10:58:12 2949 3

原创 iOS进阶 - APP冷启动优化实践

前言当用户按下Home键的时候,iOS的APP并不会马上被kill掉,还会继续存活若干时间。理想情况下,用户点击APP的图标再次回来的时候,APP几乎不需要做什么,就可以还原带退出前的状态,继续为用户服务。这种持续存活的情况下启动APP,我们称为热启动,相对而言冷启动就是APP被kill掉以后一切从头开始启动的过程。我们这里只讨论APP冷启动的情况。对于冷启动来说,启动时间是指从用户点击APP那一刻开始到用户看到第一个界面这中间的时间。我们进行优化的时候,我们将启动时间分为 pre-main 时间和

2021-01-25 16:06:18 574 2

原创 iOS进阶 - Cell复用原理和源码分析

简介在我们的日常开发中,绝大多数情况下只要详细阅读类头文件里的注释,组合UIKit框架里的大量控件就能很好的满足工作的需求。但仅仅会使用UIKit里的控件还远远不够,假如现在产品需要一个类似 Excel 样式的控件来呈现数据,需要这个控件能上下左右滑动,这时候你会发现UIKit里就没有现成的控件可用了。UITableView 可以看做一个只可以上下滚动的 Excel,所以我们的直觉是应该仿写 UITableView 来实现这个自定义的控件。这篇文章我将会通过开源项目 Chameleon 来分析UITab

2021-01-25 11:09:55 467 2

原创 iOS基础 - 摄像头/相册获取图片、压缩并上传服务器

iphone中图像通常存储在4个地方【相册、应用程序包、沙盒、Internet】,通过这4个源,我们就可以存取应用图片。

2021-01-25 10:36:19 315 1

原创 iOS基础 - NSString操作总结

Objective-C里核心的处理字符串的类就是NSString和NSMutableString这两个类,这两个类完成了Objective-C中字符串大部分功能的处理NSString字符串属性 //////////字符串属性////////// NSString *str1 = @"string"; NSLog(@"长度: %ld", str1.length); NSLog(@"描述: .

2021-01-25 10:11:13 944 1

原创 iOS基础 - 关键字const/static/extern

一、前言阅读别人的代码(一些优秀的源码)总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思的,但在概念上和具体的用法上却依然有些模糊,故特意整理汇总了下三个比较常见的关键字——const/static/extern。二、关键字const/static/extern的释义和用法** 1、const**这个单词翻译成中文是“常量”的意思。在程序中我们知道“常量”的值是不能变的,固定的。所以const关键字的作用就呼之欲出了:(1)const用来修饰右边的基本变量或指针变量

2021-01-23 16:59:33 113 1

原创 iOS基础 - 为什么使用instancetype而不是id

前言使用instancetype到底比id好在哪里?instancetype宣言不管何时,只要一个class要返回它相同的类实例,使用instancetype都是更加合适的。我们知道,当调用类中(或者子类)的-alloc、-init或者class factory(+)方法,使用instancetype关键字会返回它的类实例。在这种情况下用instancetype而不是id有100个好处。苹果也这样说:In your code, replace occurrences of id a

2021-01-23 16:20:51 159 1

原创 iOS基础 - Objective-C编码规范

语言应该使用US英语。应该:UIColor *myColor = [UIColor whiteColor]; 不应该:UIColor *myColour = [UIColor whiteColor]; 代码组织在函数分组和protocol/delegate实现中使用#pragma mark -来分类方法,要遵循以下一般结构:#pragma mark - Lifecycle - (instancetype)init {} - (void)dealloc {

2021-01-23 11:57:44 140 1

原创 如何去处理学习的深度与广度?

科学的个人知识管理 深度(专家?) 有时候跟同事、朋友、讨论伙伴聊天的时候谈到深度,具体什么才是深度,怎么达到这样的深度;借用伟大的丹麦物理学家、量子物理学家尼尔斯.玻尔说“专家就是那些在很窄的领域把所有能犯的错误都犯了的人。 An expert is a person who has made all the mistakes that can be made in a very narrow field。” 在套用一个知乎网友的回答: 知识深度创造价值...

2021-01-23 10:06:00 2678 2

原创 iOS进阶 - Runtime

1.Category 的实现原理? Category 实际上是 Category_t的结构体,在运行时,新添加的方法,都被以倒序插入到原有方法列表的最前面,所以不同的Category,添加了同一个方法,执行的实际上是最后一个。 Category 在刚刚编译完的时候,和原来的类是分开的,只有在程序运行起来后,通过 Runtime ,Category 和原来的类才会合并到一起。 2.isa指针的理解,对象的isa指针指向哪里?isa指针有哪两种类型? isa 等价于 is kind o

2021-01-21 14:19:29 122 2

原创 iOS进阶 - 性能优化

1.造成tableView卡顿的原因有哪些? 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆积很多cell。 如果重用cell,为cell创建一个ID,每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell 2.避免cell的重新布局 cell的布局填充等操作 比较耗时,一般创建时就布局好 如可以将cell单独放到

2021-01-21 14:15:01 264 2

原创 iOS进阶 - RunLoop

1.Runloop 和线程的关系? 一个线程对应一个 Runloop。 主线程的默认就有了 Runloop。 子线程的 Runloop 以懒加载的形式创建。 Runloop 存储在一个全局的可变字典里,线程是 key ,Runloop 是 value。 2.RunLoop的运行模式 RunLoop的运行模式共有5种,RunLoop只会运行在一个模式下,要切换模式,就要暂停当前模式,重写启动一个运行模式 - kCFRunLoopDefaultMode, Ap

2021-01-21 14:08:39 192 2

原创 iOS进阶 - 多线程

1.进程与线程进程: 1.进程是一个具有一定独立功能的程序关于某次数据集合的一次运行活动,它是操作系统分配资源的基本单元. 2.进程是指在系统中正在运行的一个应用程序,就是一段程序的执行过程,我们可以理解为手机上的一个app. 3.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内,拥有独立运行所需的全部资源 线程 1.程序执行流的最小单元,线程是进程中的一个实体. 2.一个进程要想执行任务,必须至少有一条线程.应用程序启动的时候,系统会默认开启一条线程,也就是主线程 进程和

2021-01-21 14:02:35 476 2

原创 iOS基础 - GCD多线程同步机制

GCD多线程同步机制

2017-09-14 14:50:21 334 4

原创 iOS基础之 - 堆与栈

1、管理方式对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。2、申请大小(1)栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈

2017-05-17 11:09:29 245 1

原创 iOS基础 - 深浅拷贝

Copy的作用在OC中,copy 是利用一个源对象产生一个副本对象,本质就是当修改源对象的属性和行为,不会影响副本对象,同样,当修改副本对象的属性和行为,不会影响源对象。Copy 的使用注意: 使用之前必须要遵守 NSCopying 协议,实现 copyWithZone: 方法其中有两点需要注意:1、Foundation类已经遵守了<NSCopying>和 <NSMutableCopying>协议,即实现了copy和mutableCopy方法,因此Foundation

2017-05-16 11:47:29 333 1

转载 iOS 图片与内存(转)

http://blog.csdn.net/ch_soft/article/details/8245944第一种解决方法:选择适当的加载方式在程序的开发过程中,经常会用到很多的图片,适当的选择加载图片的方式就显得格外的重要,如果选择不得当,很容易造成内存吃紧而引起程序的崩溃。这里介绍一下几种常见的加载方式:用UIImage加载图像的方法很多,最常用的是

2015-08-04 11:32:37 319

JAVA微信卡券及代理模式退款

JAVA微信卡券及代理模式退款

2016-05-24

vbH264解码Demo

vbH264解码Demo

2014-11-11

空空如也

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

TA关注的人

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