iOS-KVC+KVO
摘要:一、KVC 1.1 什么是KVC KVC指的是键值编码;通过key来直接访问对象的属性,然后由NSKeyValueCoding非正式协议启用的机制。 KVC本质上是对NSObject、NSArray、NSMutableDictionary、NSOrderedSet、NSSet等对象;实现NSKeyV
阅读全文
posted @
2022-07-02 11:13
suanningmeng98
阅读(116)
推荐(0)
iOS-界面优化
摘要:这篇文章参考自https://juejin.cn/post/7113799052122128392 一、卡顿原理 1.1 界面显示原理 CPU:layout UI布局,文本计算,display绘制,prepare图片解码,commit位图给GPU GPU:用于渲染,将结果放入FrameBuffer
阅读全文
posted @
2022-07-01 18:10
suanningmeng98
阅读(207)
推荐(0)
iOS-自动释放池
摘要:一、什么是自动释放池 OC中的一种内存自动回收机制,它可以延迟加入AutoreleasePool中的变量release的时机 当创建一个对象,在正常情况下,变量会在超出其作用域时立即 release ,如果将其加入到自动释放池中,这个对象并不会立即释放,而会等到 runloop 休眠 / 超出aut
阅读全文
posted @
2022-07-01 15:05
suanningmeng98
阅读(965)
推荐(0)
iOS-散列表
摘要:一、散列表sideTable的数据结构 SideTable主要包含spinlock锁,引用计数表(存放从extra_rc接收的一半引用计数),弱引用表。 truct SideTable { spinlock_t slock; // 存放从extra_rc接收的那一半引用计数 RefcountMap
阅读全文
posted @
2022-06-30 14:21
suanningmeng98
阅读(208)
推荐(0)
iOS-内存管理
摘要:一、内存分布 当程序运行时,系统会开辟内核区、用户区。 值类型:存入栈;无需进行内存管理 引用类型:存入堆;无需进行内存管理 二、iOS的内存管理方案 2.1 Tagged Pointer(无需进行引用计数) Tagged Pointer 是一个指针,指针中包含Tagged标记,用于区分存储的数据类
阅读全文
posted @
2022-06-29 22:17
suanningmeng98
阅读(82)
推荐(0)
iOS架构之MVC+MVVM
摘要:一、简单了解MVC 经典图如下:M-Model;V- view;C-controller;就是Controller对象拥有View和Model对象,两者通过Controller进⾏沟通。在MVC中,controller都是挑大头的存在,网络请求的接收和处理都放在了Controller中,Model只
阅读全文
posted @
2022-06-27 20:54
suanningmeng98
阅读(374)
推荐(0)
iOS启动优化之编译器插桩
摘要:一、什么是编译器插桩 编译器插桩是指在编译期间修改已有的代码或者生成新的代码。 二、准备知识 Tracing PCs是用来跟踪CPU将要执行的指令代码;我们可以借此拿到程序启动时需要的用到的函数,然后减少缺页中断的产生,从而达到启动优化的效果。如何配置如下面这个图所示: 工程中配置使用它-fsani
阅读全文
posted @
2022-06-23 17:24
suanningmeng98
阅读(355)
推荐(0)
iOS之启动优化
摘要:一、APP的启动(分为两个阶段) 1.1 pre-main pre-main在main()函数之前,可分为四个阶段: 1.dylibloading:加载动态库。可以通过减少动态库的数量来优化这一部分所消耗的时间。 苹果的建议是一个项目里面自己制作的动态库的数量不超过6个。 2. ObjCsetup:
阅读全文
posted @
2022-06-17 19:46
suanningmeng98
阅读(861)
推荐(0)
IOS-LLVM
摘要:一、LLVM概述 LLVM(Low Level Virtual Machine)是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-t
阅读全文
posted @
2022-06-17 11:13
suanningmeng98
阅读(194)
推荐(0)
iOS之Block
摘要:一、Block的三种类型 1.全局Block(NSGlobalBlock) 2.栈Block(NSMallocBlock) 3.堆Block(NSStackBlock) 区别在于:如果没有引用局部变量,或者只引用了静态变量和全局变量,则为全局Block,如果内部有使用局部变量,如果有被强指针引用过,
阅读全文
posted @
2022-06-16 17:16
suanningmeng98
阅读(285)
推荐(0)
iOS之@synchronized多线程递归锁的实现
摘要:@synchronized支持多线程递归调用,接下来我们来看一下@synchronized的底层实现。 一、@synchronized的源码入口 id _sync_obj = (id)obj1; objc_sync_enter(_sync_obj); struct _SYNC_EXIT { _SYN
阅读全文
posted @
2022-06-14 21:58
suanningmeng98
阅读(632)
推荐(0)
iOS-锁
摘要:一 、线程安全 1.1 什么是线程安全 线程操作共享数据的时候不会出现意想不到的结果就叫线程安全,否则,就是线程不安全 1.2 原子属性是一定是线程安全的? 原子属性只能保障 set 或者 get的读写安全,但我们在使用属性的时候,往往既有set又有get,所以说原子属性并不是线程安全的。 二、 i
阅读全文
posted @
2022-06-04 11:21
suanningmeng98
阅读(250)
推荐(0)
GCD之栅栏函数、信号量、调度组、单例
摘要:一、单例 1.1 单例示例 static dispatch_once_t onceToken; dispatch_once(onceToken, ^{ <#code#> }); 1.2 如何使用 参考链接:https://juejin.cn/post/7103015785685057572#head
阅读全文
posted @
2022-06-03 20:23
suanningmeng98
阅读(470)
推荐(0)
GCD之死锁和同步异步函数解析(附带面试题)
摘要:一 死锁 1.1 死锁产生的原因 我们根据死锁的提示:__dispatch_wait_for_queue查找到GCD源码中死锁的源码: 我们查找其中关于_dq_state_drain_locked_by的函数调用: 由此,我们可以知道,当线程和队列相同时就会发生死锁。 1.2 死锁实例 //1 //
阅读全文
posted @
2022-06-03 16:06
suanningmeng98
阅读(291)
推荐(0)
多线程-GCD(1)(附带经典面试执行顺序求解)
摘要:一、进程和线程 1.1 什么是进程和线程 进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内 线程是进程的基本执行单元,一个进程的所有任务都在线程中执行,进程要想执行任务,必须得有线程,进程至少要有一条线程。程序启动会默认开启一条线程,这条线程
阅读全文
posted @
2022-06-03 10:57
suanningmeng98
阅读(323)
推荐(0)
OC之分类相关
摘要:一、分类 1.1 分类结构体 struct category_t { const char *name; classref_t cls; WrappedPtr<method_list_t, PtrauthStrip> instanceMethods; WrappedPtr<method_list_t
阅读全文
posted @
2022-05-22 20:08
suanningmeng98
阅读(96)
推荐(0)
dyld中的objc_init、map_images、load_images
摘要:一 我们要分析的流程阶段: 参考这篇博客:https://juejin.cn/post/7098001140553351198#heading-1 dyld在main函数之前会递归加载动态库,此时会间接调用到_objc_init, (在libSystem动态库被加载的时候,它的子libObjc会调用
阅读全文
posted @
2022-05-22 15:39
suanningmeng98
阅读(225)
推荐(0)
APP启动流程-dyld
摘要:首先,我们先来认识一下Mach-O文件: 一、Mach-O文件 mach-o是iOS/macOS二进制文件的格式,mach-o又分为几种不同的类型。常见的mach-o文件类型有以下几种: Executable(产物为ipa包) Dynamic Library(产物为动态库) Bundle(产物为bu
阅读全文
posted @
2022-05-20 21:25
suanningmeng98
阅读(315)
推荐(0)
objc_msgSend之动态解析和消息转发
摘要:前一个博客介绍了objc_msgSend消息发送的机制,本节我们从动态解析以及之后的消息转发来继续了解。 一、动态解析 我们通过上面的forward_imp来深入了解一下,我们通过对forward_imp一层层的调用关系最后定位到了最后这张图片,即当找不到方法实现的时候,就尝试一次方法解析。一次动态
阅读全文
posted @
2022-05-11 17:18
suanningmeng98
阅读(136)
推荐(0)
objc_msgSend消息发送机制
摘要:一、消息发送 我们先来了解一下什么是消息发送;C语言是静态,OC是动态类型。在编译的时候不知道具体类型,运行的时候才会检查数据类型,根据函数名找到实现。实现语言动态的就是Runtime的API,主要有两大核心: 动态配置:动态的修改类的信息。添加属性、方法、甚至成员变量的值等数据结构。 消息传递:包
阅读全文
posted @
2022-05-09 17:00
suanningmeng98
阅读(731)
推荐(0)