![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
iOS底层分析
文章平均质量分 86
shengdaVolleyball
这个作者很懒,什么都没留下…
展开
-
38、iOS底层分析 - 线程锁(八)分类及其他补充
锁总结1、自旋锁线程反复检查锁变量是否可用,由于线程在这一过程中保持执行,因此是一种忙等待。一旦获取了自旋锁,线程会一直保持该锁,直至显示释放自旋锁,自旋锁避免了进程上下文的调度开销。因此对于线程只会阻塞很短时间的场合是有效的,而atomic 就是通过在 setter、getter 方法中添加自旋锁来实现线程安全的。2、互斥锁互斥锁时用于多线程编程中,防止多条线程同时对统...原创 2020-04-08 16:06:11 · 150 阅读 · 0 评论 -
37、iOS底层分析 - 线程锁(七)信号量 dispatch_semaphore
大纲信号量介绍 信号量使用 信号量源码分析一、信号量 dispatch_semaphore信号量分析。GCD 的源码 在libdispatch 库中实现的,可以在 Apple Open Source下载使用:1、dispatch_semaphore_create(value) 创建信号量,value一般情况下传02、dispatch_semaph...原创 2020-04-08 15:20:49 · 832 阅读 · 2 评论 -
36、iOS底层分析 - 线程锁(五)- 自旋锁 atomic
大纲atomic(原子性)1、atomic 原理?2、atomic 修饰的属性绝对安全吗?自旋锁一直等待,效率是最高互斥锁不会一直等待,会休息,当回调回来的时候才会去再次访问。atomic 和 nonatomic 是用来修饰属性的。查看源码 - objc (为什么是看objc 的源码,因为atomic用于属性修饰 setter/getter 底层实现方法...原创 2020-04-08 10:40:00 · 293 阅读 · 0 评论 -
34、iOS底层分析 - 线程锁(三)条件锁 NSCondition
大纲条件锁介绍 应用 源码NSCondition条件锁条件锁我们调用wait方法就把当前线程进入等待状态,当调用了signal方法就可以让该线程继续执行,也可以调用broadcast广播方法。NSCondition 和 NSLock 的区别NSLock:在获取不到锁的时候自动使线程进入休眠,锁被释放后线程自动被唤醒NSCondition:可以使我们更加灵活的...原创 2020-04-07 20:59:16 · 311 阅读 · 0 评论 -
35、iOS底层分析 - 线程锁(四)条件锁 NSconditionLock
3、NSLock 分析4、NSCondition (条件)分析5、属性设置 atomic6、os_unfair_lock 和 OSSPinLock@property(nonatomic, strong) NSMutableArray * testArray;@property(nonatomic, strong) NSCondition * testCondition...原创 2020-04-07 21:44:23 · 315 阅读 · 0 评论 -
33、iOS底层分析 - 线程锁(二) @synchronized
大纲:1、@synchronized 分析2、@synchronized 注意点3、NSLock 分析4、NSCondition (条件)分析5、属性设置 atomic6、os_unfair_lock 和 OSSPinLock一、@synchronized分析@property(nonatomic, assign) NSUInteger ticket...原创 2020-04-06 21:59:02 · 451 阅读 · 0 评论 -
21、iOS底层分析 - 线程锁(一)NSLock
大纲常用锁介绍 自旋锁和互斥锁的一些问题 NSLock及源码分析 NSLock 坑一、常用锁介绍锁的目的是为了解决资源抢夺 iOS中的常用的锁有如下几种: 1、自旋锁: 使用与多线程同步的一种锁,线程反复检查锁变量是够可用。由于线程在这一过程中保持执行m,因此是一种忙等待。一旦获取了自旋锁,线程会一直保持该锁,直到显示释放自旋锁。自旋锁...原创 2020-04-06 14:36:04 · 485 阅读 · 0 评论 -
28、iOS底层分析 - 内存管理
#import "LJLMemoryManagementVC.h"#import "DeviceHeader.h"#import "LJLAutoreleasepoolViewController.h"#import "LJLPerson.h"#import "LJLPerson+LJL.h"#import <objc/runtime.h>#import "LJLPro...原创 2020-03-30 18:21:07 · 978 阅读 · 0 评论 -
31、iOS底层分析 - 界面优化
大纲:1、界面渲染流程2、UIView & CALayer3、卡顿检测4、案例实战5、异步渲染1、界面渲染流程UIKit :日常交互组件基本上都是来自于 UIKit,我们可以通过设置 UIKit 的 Layout ,来完成日程界面的绘画工作。但是并不具备在屏幕上成像的能力,在这个过程中,将对用户的操作事件进行响应,从而将当前的事件通过图层的图层树...原创 2020-03-27 19:07:20 · 995 阅读 · 0 评论 -
30、iOS底层分析 - RunLoop
#import "LJLRunLoopViewController.h"#import "LJLThread.h"@interface LJLRunLoopViewController ()@property(nonatomic, assign) BOOL isStopping;@end@implementation LJLRunLoopViewController- (v...原创 2020-03-24 16:14:56 · 418 阅读 · 0 评论 -
29、iOS底层分析 - @autoreleasepool 自动释放池
@autoreleasepool 自动释放池面试题:1、临时变量什么时候释放?2、自动释放池原理?3、自动释放池能否嵌套使用?研究分析例如main 中的 @autoreleasepool 思路是什么?clang、汇编 int main(int argc, const char * argv[]) { @autoreleasepool { ...原创 2020-03-22 14:24:33 · 526 阅读 · 0 评论 -
27、iOS底层分析 - 启动优化(二进制重排)
启动优化 - 二进制重拍iOS系统会对虚拟内存和物理内存进行分页,虚拟内存到物理内存的映射都是以页为最小单位的。启动:我们所说的启动时从点击icon 开始到 APP第一页显示。冷启动:程序完全退出(例杀掉进程后又开了许多其他的APP,这个时候程序所对应的物理内存已经被其他的程序占用,需要重新从虚拟内存加载到物理内存)或第一次安装启动(第一次安装 或 卸载后重装等)。...原创 2020-03-20 12:48:49 · 1410 阅读 · 0 评论 -
19、iOS底层分析 - GCD(二)应用分析
GCD应用分析1、dispatch_group_t 组GCD线程同步例如:同时进行多个网络请求(例:任务1、任务2),这几个任务互相不想干,但是等任务全部完成之后再执行接下来的任务,这种场景下,最常用的就是GCD 的group1、dispatch_group_async通过dispatch_group_async() 向组中添加任务1、任务2,然后通过dispatch_gr...原创 2020-03-15 16:39:20 · 128 阅读 · 0 评论 -
18、iOS底层分析 - GCD(一)基本概念与简单使用
GCD介绍 GCD 全程 Grand Central Dispatch,由C 语言实现,是苹果为多核的并行运行运算提出的解决方案,GCD 会自动利用更多的CPU 内核,自动管理线程的生命周期。GCD 实现的库是 libdispatch,可以在 Apple Open Source 下载 源码创建线程、调度任务、销毁线程都是由GCD自己进行管理,只需要告诉GCD 想要执行什么任...原创 2020-03-13 18:09:45 · 387 阅读 · 0 评论 -
17、iOS底层分析 - 多线程(一)相关概念
一、进程与线程1.1进程 进程是操作系统分配资源和调度的基本单位。在iOS上,一个APP运行起来的实例就是一个进程,每个进程在内存中都有自己独立的地址段(专用且受保护的内存空间),拥有独立运行所需的全部资源。1.2 线程 线程是进程的基本执行单元,进程中的所有任务都在线程中执行,因此,一个进程中至少要有一个线程。iOS 程序启动后会默认开启一个主线程,也就 UI 线程。...原创 2020-03-11 23:07:27 · 252 阅读 · 0 评论 -
23、iOS底层分析 - Block(二)
Block 的本质问题1、为什么可以使用 %@ 打印? 因为block 是个对象 结构体 也叫匿名函数2、Block 自动捕获外界变量 自动生成一个同名的属性来保存。copy一份外界变量进去3、Block为什么需要 block() 来触发调用 函数申明,具体的函数实现是在需要调用的地方进行调用。4、__block 的原理 生...原创 2020-03-11 01:14:13 · 174 阅读 · 0 评论 -
16、iOS底层分析 - 自定义KVO
自定义KVO分析了KVO的实现原理,为了加深印象模仿系统的方式自定义一个KVO。一、接口设计1.1 基本功能接口模仿系统的KVO接口,提供以下基本接口。注册观察者 移除观察者 回调// NSObject+LJLKVO.h#import <Foundation/Foundation.h>#import "LJLKVOInfo.h"@interf...原创 2020-03-08 23:00:39 · 249 阅读 · 0 评论 -
15、iOS底层分析 - KVO
KVC、KVO是iOS中经常会用到也是面试中经常会被问到的。今天就来探究一下KVO。什么是KVO?KVO:键值观察机制,它提供了观察某一属性变化的方法KVO的全称是 KeyValueObserving ,是苹果提供的一套事件通知机制。允许对象监听另一个对象属性的变化,并在改变时接收到事件。由于KVO的实现机制,所以对 属性 才会发生作用,一般继承自NSObject 的对象都默认支持KV...原创 2020-03-08 01:45:26 · 297 阅读 · 0 评论 -
22、iOS底层分析 - Block (一)
block是在iOS开发中用的比较多的,我对block的理解也不是很透彻,学习一下进行分析分析。Block1、block有几种?一般我们能用到的知道的block有三种:NSGlobalBlock (全局block ) NSStackBlock (栈block ) NSMallocBlock(堆block)但是其实block总共有6种,剩下的3种是系统级别的:通过查看源码...原创 2020-03-07 00:19:54 · 220 阅读 · 0 评论 -
14、iOS底层分析 - KVC
KVCapple文档KVC定义KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一。很多高级的iOS开发技巧都是基于KVC实现的。在实现了访问器方法的类中,使用点语法...原创 2020-02-13 23:03:11 · 236 阅读 · 0 评论 -
9、iOS底层分析 - 类的加载
程序启动静态库是直接编译进程序的 动态库是需要的时候动态添加的,dyld链接的就是动态库 dyld 是苹果的动态链接器,每个程序依赖的动态库都需要通过dyld(位于/usr/lib/dyld)一个一个加载到内存。 加载的是镜像文件 如果每个程序运行的时候都重复的去加载,势必造成运行缓慢,为了优化启动速度和提高程序性能,就用到了共享缓存机制。所有默认的动态链接库被合并成一个大的缓存文件...原创 2020-01-22 16:47:24 · 261 阅读 · 0 评论 -
8、iOS底层分析 - 消息转发机制
消息转发机制查看方法帮助command+右键 show Quick Help 然后 command+shift+0消息发送、查找objc_msgSend,当方法的IMP没有寻找到时,首先进入动态方法决议,在 lookUpImpOrForward 方法内部IMP lookUpImpOrForward(Class cls, SEL sel, id inst, ...原创 2020-01-21 20:40:28 · 275 阅读 · 0 评论 -
7、iOS底层分析 - 消息查找流程
方法的查找流程对象方法测试 对象的实例方法 - 自己有 对象的实例方法 – 自己没有 – 找父类的 对象的实例方法 – 自己没有 – 父类没有 – 找父类的父类 – NSObject 对象的实例方法 – 自己没有 – 父类没有 – 找父类的父类 – NSObject也没有 – 崩溃 总结: SelfClass -> SuperClass ->...->NSO...原创 2020-01-20 22:24:20 · 320 阅读 · 1 评论 -
6、iOS底层分析 - 消息发送(objc_msgeSend)分析
调试分析OC中的方法到底是怎么调用的呢?之前查资料知道oc的方法调用是通过消息发送的形式进行调用,那就来结合源码探究一下 LGPerson *person = [[LGPerson alloc] init]; Class pClass = [LGPerson class]; [person sayNB]; 汇编查看流程(注意使用真机调试)Debug -...原创 2020-01-20 20:53:29 · 502 阅读 · 0 评论 -
5、iOS底层分析 - cache_t 分析
分析cache_t 之前先看一下 objc_class,类在底层的结构(objc-runtime-new.h中)。我们知道了isa是指向元类的,superclass 是父类相关,bits里面存的是类的属性和实例变量以及实例方法。剩下的cache 看名字是缓存,现在来看一下具体的struct objc_class : objc_object { // Class ISA; // 8...原创 2020-01-20 14:01:09 · 292 阅读 · 0 评论 -
4、iOS底层分析 - 类的结构分析
类通常熟知定义1、关于类类的设计只关注三个东西:类名、属性和方法拥有相同属性和行为的对象都可以抽象为一个类。类名是标识符的一种,需要符合规范,通常类名的第一个字母大写,且不能有下划线,如果有多个单词使用驼峰原则。在对方法进行类的划分中,一般采取的做法是谁最熟悉这个方法那么就把这个方法划分给谁。在OC中,对象对方法的调用称为消息机制,即向既定的对象发送了什么消息。2、简单内存分析...原创 2020-01-19 17:17:55 · 241 阅读 · 0 评论 -
3、iOS底层分析 — isa的初始化&指向分析
isa通过查看类的源码 objc_class 可以发现里面有一个隐藏的属性 ISA 。objc_class 中的ISA是隐藏的,是来自于父类 objc_object。这个ISA 是什么呢?struct objc_class : objc_object { // Class ISA; Class superclass; cache_t cache; ...原创 2020-01-18 18:09:21 · 284 阅读 · 0 评论 -
2、iOS底层分析—内存对齐原理
内存对齐1、CPU 存取原理CPU 并不是以字节为单位存取数据的。CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块进行读取的。每次内存存取都会产生一个固定的开销,减少内存存取次数将提升程序的性能。所以 CPU 一般会以 ...原创 2020-01-18 12:31:43 · 156 阅读 · 0 评论 -
1、iOS底层分析 — alloc分析
一、alloc init探索简介:iOS中alloc是为对象申请开辟内存的方发, 初始化的时候用的最多的就是如下形式。[[xxx alloc] init];问题:1、想要分析alloc从哪入手,怎么分析?2、alloc在底层都做了什么?在底层怎么实现的?3、alloc的时候已经创建了对象,init里面什么都没有写(看过源码才知道的),那么init到底用来干什么呢?...原创 2020-01-18 12:18:06 · 393 阅读 · 0 评论