自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 问答 (1)
  • 收藏
  • 关注

原创 内存5大区

堆:存放通过 alloc , new , malloc 等创建出来的变量。⼀般以0x6开头栈区:存放局部变量,⽅法参数, 对象的指针 等。栈的内存⼤⼩有限,主线程1MB,其他线程512KB ,栈是线程独有的,栈在线程开始的时候初始化,每个线程的栈互相独⽴ ⼀般以0x7开头全局区/静态区:存放全局变量和静态变量。⼀般以0x1开头 ,编译时分配的内存区域在程序运⾏时⼀直存在,直到程序运⾏结束才会被释放常量区:常量。(const修饰) ⼀般以0x1开头 ,常量区的内存和全局区⼀样也是在编译阶段进⾏。

2023-09-13 19:11:49 43

原创 swift 类和结构体

我们先来看一段代码 struct/class LGTeacher{ var age: Int var name: String init(age: Int, name: String) { self.age = age self.name = name } deinit{ } } 结构体和类的主要相同点有: 主要的不同点有: 对于类与结构体我们需要区分的第一件事就是: 这里我们借助两个指令来查看当前变量的内存结构po : p 和 po 的区别在于使用 po 只会输出对应的值,而 p 则会返回值的类型以及命令

2023-09-12 19:07:15 50

原创 自动释放池 runloop autorelease释放

线程的⾃动释放池是⼀个指针堆栈。(说明⾃动释放池肯定和线程是有关联的)每个指针要么是将要释放的对象,要么是⼀个POOL_BOUNDARY,作为⾃动释放池的边界。(⾃动释放池⾥⾯的数据有俩种类型,⼀种是将要被释放的对象,另⼀种是POOL_BOUNDARY,超出POOL_BOUNDARY,就相当于不在当前释放池的范围之内了。有⼀个指向该池的 POOL_BOUNDARY 的指针。当池被弹出时,每个⽐哨兵更热的对象都会被释放。(在调⽤pop函数的时候,整个⾃动释放池⾥⾯的对象都会被释放。

2023-09-12 08:39:41 45

原创 weak原理 添加弱引用流程总结 自动释放池

如果被弱引⽤的对象为nil 或这是⼀个TaggedPointer,直接返回,不做任何操作。如果被弱引⽤对象正在析构,则抛出异常。如果被弱引⽤对象不能被weak引⽤,直接返回nil。如果对象没有再析构且可以被weak引⽤,则调⽤weak_entry_for_referent ⽅法根据弱引⽤对象的地址从弱引⽤表中找到对应的weak_entry,如果能够找到则调⽤append_referrer ⽅法向其中插⼊weak指针地址。否则新建⼀个weak_entry。

2023-09-12 08:30:17 55

原创 内存5大区 引用计数 iOS中内存管理方案

根据苹果官⽅的说法, Tagged Pointer 有3倍的空间效率的提升,以及106倍的创建和销毁速度的。通过isa可以很容易的拿到extra_rc,通过extra_rc进⾏引⽤计数的存储是很⽅便的。Tagged Pointer 指针,它表示的不再是地址,⽽是真正的值。到SideTable这张表,再在表中拿到引⽤计数表,才能进⾏操作,表操作还要做加锁和解锁操作,因为在栈上,不必在堆上为其分配内存,节省了很多内存开销。Tagged Pointer 也是指针,是⼀种被打上了tagged标记的指针。

2023-09-12 08:22:37 34

原创 iOS App启动 ASLR Page Fault

pre-main,main()函数之前,系统加载可执⾏⽂件,加载动态链接库dyld,dyld递归加载所有依赖的动态库,然后dyld调起main()函数。pre-main分为四个阶段:i. dylib loading:加载动态库。可以通过减少动态库的数量来优化这⼀部分所消耗的时间。苹果的建议是⼀个项⽬⾥⾯⾃⼰制作的动态库的数量不超过6个。ii. ObjC setup:注册Objc类,进⾏selector唯⼀性检测等。可以通过减少Objc类的数量,减少selector的数量来进⾏优化。

2023-09-12 07:47:39 132

原创 block 本质 解决block循环引用 block底层原理

block的本质是⼀个 Block_layout 类型的结构体。copy和dispose函数是⽤来对block内部的对象进⾏内存管理的,block拷⻉到堆上会调⽤copy函数,在block从堆上释放的时候会调⽤dispose函数。block的签名:@?

2023-09-11 17:58:30 38

原创 TLS StripedMap

TLS就是线程局部存储,是操作系统为线程单独提供的私有空间,能存储只属于当前线程的⼀些数据。

2023-09-11 17:33:37 43

原创 线程安全 自旋锁 互斥锁 ⾃旋锁优先级反转

多线程操作共享数据的时候不会出现意想不到的结果就叫线程安全,否则,就是线程不安全。

2023-09-11 16:16:16 65

原创 GCD单例 栅栏函数 调度组 信号量dispatch_semaphore dispatch_source

基本思想就是通过状态的判断使得block只被调⽤⼀次。

2023-09-11 15:30:21 86

原创 iOS GCD 死锁

在当前线程(线程所执⾏的任务是从当前队列取出来的)同步的向串⾏队列⾥⾯添加任务,就会产⽣死锁。

2023-09-11 15:19:33 16

原创 iOS 线程与进程 GCD

进程是指在系统中正在运⾏的⼀个应⽤程序,每个进程之间是独⽴的,每个进程均运⾏在其专⽤的且受保护的内存空间内线程是进程的基本执⾏单元,⼀个进程的所有任务都在线程中执⾏,进程要想执⾏任务,必须得有线程,进程⾄少要有⼀条线程。程序启动会默认开启⼀条线程,这条线程被称为主线程或UI 线程。

2023-09-11 15:12:00 31

原创 iOS 分类

分类的数据结构。

2023-09-11 15:02:24 17

原创 _objc_init 初始化操作

7. didCallDyldNotifyRegister:标识对_dyld_objc_notify_register的调⽤已完成。5.当有多个类别(Category)都实现了load⽅法,这⼏个load⽅法都会执⾏,但执⾏顺序不确定(其执⾏。6.当然当有多个不同的类的时候,每个类load 执⾏顺序与其在Compile Sources出现的顺序⼀致。1: 加载所有类到类的gdb_objc_realized_classes表中。1.当⽗类和⼦类都实现load函数时,⽗类的load⽅法执⾏顺序要优先于⼦类。

2023-09-11 14:52:53 20

原创 iOS 程序启动相应的工作

在启动App时,真正的加载过程是从exec()函数开始,系统会调⽤exec()函数创建进程,并且分配内存。然后会执⾏以下的操作1. 把App对应的可执⾏⽂件加载到内存。2. 把dyld加载到内存。dyld也是⼀个可执⾏的程序3. dyld进⾏动态链接。

2023-09-11 14:13:37 20

原创 iOS 动态决议 快速转发

埋点就是在应⽤中特定的流程收集⼀些信息,⽤来跟踪应⽤使⽤的状况,然后精准分析⽤户数据。⾯向切⾯编程(AOP)在不修改源代码的情况下,通过运⾏时给程序添加统⼀功能的技术。⽐如⻚⾯停留时间、点击按钮、浏览内容等等。

2023-09-11 14:11:13 18

原创 【无标题】

所以,综合上⾯的代码的出来的结论就是:在arm64结构,也就是真机环境下,刚开始初始化的缓存⽅法的容器的⻓度2,当容器的⻓度⼩于8时,是满容量了才扩容。当容器的⻓度⼤于8时,是7/8扩容。也就是说当容器的⻓度为8时,容器可以存储8个⽅法。当容器的⻓度为16时,当第15个⽅法需要存储进来的时候,容器就要扩容了。在x86_64架构下,刚开始初始化的容器的⻓度为4,是3/4扩容。这⾥的3/4扩容指的是:如果容器的⻓度为4,当第3个数据需要存储的时候,就要扩容了。如果容器的⻓度为8,当第6个。

2023-09-11 14:06:59 14

原创 元类 class_ro_t class_rw_t class_rw_ext_t

主要的⽬的是为了复⽤消息机制。在OC中调⽤⽅法,其实是在给某个对象发送某条消息。消息的发送在编译的时候编译器就会把⽅法转换为objc_msgSend这个函数。id objc_msgSend(id self, SEL op, ...) 这个函数有俩个隐式的参数:消息的接收者,消息的⽅法名。通过这俩个参数就能去找到对应⽅法的实现。objc_msgSend函数就会通过第⼀个参数消息的接收者的isa指针,找到对应的类,如果我们是通过。

2023-09-11 11:57:51 68

原创 iOS 类对象 元类

类也是对象,类对象有且只有⼀个。类对象本质为objc_class结构体。类对象⾥⾯存储了类的⽗类、属性、实例⽅法、协议、成员变量、⽅法缓存等等。

2023-09-11 11:46:14 50

原创 iOS 对象内存分析

对象⾥⾯存储了⼀个isa指针 + 成员变量的值,isa指针是固定的,占8个字节,所以影响对象内存的只有成员变量(属性会⾃动⽣成带下划线的成员变量)

2023-09-11 11:38:13 32

原创 iOS alloc的使用

3:收尾⼯作:结构体的总⼤⼩,也就是sizeof的结果必须是其内部最⼤成员的整数倍,不⾜的要补⻬。储的起始位置要从该成员⼤⼩或者成员的⼦成员⼤⼩的整数倍开始(⽐如int为4字节,则要从4的整。“块”为单位读取的,所以⼤家也经常听到⼀块内存,“块”的⼤⼩也就是内存存取的⼒度。对⻬的话,在我们频繁的存取内存的时候,CPU就需要花费⼤量的精⼒去分辨你要读取多少字节,但是,CPU在读取内存的时候,却不是以字节为单位来读取的,⽽是以。如果以8位字节对⻬的话,如果连续的两块内存都是没有属性的对象,那么它们的内存空。

2023-09-11 11:20:28 53

空空如也

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

TA关注的人

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