随笔分类 -  从OC开始底层学习

1 2 下一页
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) 推荐(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) 推荐(0)
iOS-自动释放池
摘要:一、什么是自动释放池 OC中的一种内存自动回收机制,它可以延迟加入AutoreleasePool中的变量release的时机 当创建一个对象,在正常情况下,变量会在超出其作用域时立即 release ,如果将其加入到自动释放池中,这个对象并不会立即释放,而会等到 runloop 休眠 / 超出aut 阅读全文
posted @ 2022-07-01 15:05 suanningmeng98 阅读(965) 评论(0) 推荐(0)
iOS-散列表
摘要:一、散列表sideTable的数据结构 SideTable主要包含spinlock锁,引用计数表(存放从extra_rc接收的一半引用计数),弱引用表。 truct SideTable { spinlock_t slock; // 存放从extra_rc接收的那一半引用计数 RefcountMap 阅读全文
posted @ 2022-06-30 14:21 suanningmeng98 阅读(208) 评论(0) 推荐(0)
iOS-内存管理
摘要:一、内存分布 当程序运行时,系统会开辟内核区、用户区。 值类型:存入栈;无需进行内存管理 引用类型:存入堆;无需进行内存管理 二、iOS的内存管理方案 2.1 Tagged Pointer(无需进行引用计数) Tagged Pointer 是一个指针,指针中包含Tagged标记,用于区分存储的数据类 阅读全文
posted @ 2022-06-29 22:17 suanningmeng98 阅读(82) 评论(0) 推荐(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) 推荐(0)
iOS启动优化之编译器插桩
摘要:一、什么是编译器插桩 编译器插桩是指在编译期间修改已有的代码或者生成新的代码。 二、准备知识 Tracing PCs是用来跟踪CPU将要执行的指令代码;我们可以借此拿到程序启动时需要的用到的函数,然后减少缺页中断的产生,从而达到启动优化的效果。如何配置如下面这个图所示: 工程中配置使用它-fsani 阅读全文
posted @ 2022-06-23 17:24 suanningmeng98 阅读(355) 评论(0) 推荐(0)
iOS之启动优化
摘要:一、APP的启动(分为两个阶段) 1.1 pre-main pre-main在main()函数之前,可分为四个阶段: 1.dylibloading:加载动态库。可以通过减少动态库的数量来优化这一部分所消耗的时间。 苹果的建议是一个项目里面自己制作的动态库的数量不超过6个。 2. ObjCsetup: 阅读全文
posted @ 2022-06-17 19:46 suanningmeng98 阅读(861) 评论(0) 推荐(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) 推荐(0)
iOS之Block
摘要:一、Block的三种类型 1.全局Block(NSGlobalBlock) 2.栈Block(NSMallocBlock) 3.堆Block(NSStackBlock) 区别在于:如果没有引用局部变量,或者只引用了静态变量和全局变量,则为全局Block,如果内部有使用局部变量,如果有被强指针引用过, 阅读全文
posted @ 2022-06-16 17:16 suanningmeng98 阅读(285) 评论(0) 推荐(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) 推荐(0)
iOS-锁
摘要:一 、线程安全 1.1 什么是线程安全 线程操作共享数据的时候不会出现意想不到的结果就叫线程安全,否则,就是线程不安全 1.2 原子属性是一定是线程安全的? 原子属性只能保障 set 或者 get的读写安全,但我们在使用属性的时候,往往既有set又有get,所以说原子属性并不是线程安全的。 二、 i 阅读全文
posted @ 2022-06-04 11:21 suanningmeng98 阅读(250) 评论(0) 推荐(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) 推荐(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) 推荐(0)
多线程-GCD(1)(附带经典面试执行顺序求解)
摘要:一、进程和线程 1.1 什么是进程和线程 进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内 线程是进程的基本执行单元,一个进程的所有任务都在线程中执行,进程要想执行任务,必须得有线程,进程至少要有一条线程。程序启动会默认开启一条线程,这条线程 阅读全文
posted @ 2022-06-03 10:57 suanningmeng98 阅读(323) 评论(0) 推荐(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) 推荐(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) 推荐(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) 推荐(0)
objc_msgSend之动态解析和消息转发
摘要:前一个博客介绍了objc_msgSend消息发送的机制,本节我们从动态解析以及之后的消息转发来继续了解。 一、动态解析 我们通过上面的forward_imp来深入了解一下,我们通过对forward_imp一层层的调用关系最后定位到了最后这张图片,即当找不到方法实现的时候,就尝试一次方法解析。一次动态 阅读全文
posted @ 2022-05-11 17:18 suanningmeng98 阅读(136) 评论(0) 推荐(0)
objc_msgSend消息发送机制
摘要:一、消息发送 我们先来了解一下什么是消息发送;C语言是静态,OC是动态类型。在编译的时候不知道具体类型,运行的时候才会检查数据类型,根据函数名找到实现。实现语言动态的就是Runtime的API,主要有两大核心: 动态配置:动态的修改类的信息。添加属性、方法、甚至成员变量的值等数据结构。 消息传递:包 阅读全文
posted @ 2022-05-09 17:00 suanningmeng98 阅读(731) 评论(0) 推荐(0)

1 2 下一页