美文网首页
iOS 内存(系统引用的技术)了解

iOS 内存(系统引用的技术)了解

作者: 奋斗的小马达 | 来源:发表于2021-02-23 10:38 被阅读0次

iOS程序的内存布局


iOS内存布局.png

Tagged Pointer

1、从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储

2、在没有使用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值

3、使用Tagged Pointer之后,NSNumber指针里面存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中

4、当指针不够存储数据时,才会使用动态分配内存的方式来存储数据

5、objc_msgSend能识别Tagged Pointer,比如NSNumber的intValue方法,直接从指针提取数据,节省了以前的调用开销

如何判断一个指针是否为Tagged Pointer?
iOS平台,最高有效位是1(第64bit)
Mac平台,最低有效位是1

Tagged Pointer引用前后对比.png

OC对象的内存管理

在iOS中,使用引用计数来管理OC对象的内存

一个新创建的OC对象引用计数默认是1,当引用计数减为0,OC对象就会销毁,释放其占用的内存空间

调用retain会让OC对象的引用计数+1,调用release会让OC对象的引用计数-1

内存管理的经验总结
当调用alloc、new、copy、mutableCopy方法返回了一个对象,在不需要这个对象时,要调用release或者autorelease来释放它
想拥有某个对象,就让它的引用计数+1;不想再拥有某个对象,就让它的引用计数-1

可以通过以下私有函数来查看自动释放池的情况
extern void _objc_autoreleasePoolPrint(void);

copy和mutableCopy

copy和mutableCopy.png
 拷贝的目的:产生一个副本对象,跟源对象互不影响
 修改了源对象,不会影响副本对象
 修改了副本对象,不会影响源对象

 iOS提供了2个拷贝方法
 1.copy,不可变拷贝,产生不可变副本
 2.mutableCopy,可变拷贝,产生可变副本
 
 深拷贝和浅拷贝
 1.深拷贝:内容拷贝,产生新的对象
 2.浅拷贝:指针拷贝,没有产生新的对象
 

相关文章

  • iOS 内存(系统引用的技术)了解

    iOS程序的内存布局 Tagged Pointer OC对象的内存管理 copy和mutableCopy

  • ios内存管理记录

    ios的内存管理技术是自动引用计数也就是(Automatic Reference Counting,自动引用计数,...

  • iOS内存管理

    iOS内存管理需要了解这几个方面: 内存布局 引用计数 自动释放池 循环引用和core foundation对象的...

  • iOS Runtime 数据结构

    ios内存布局 内存管理方案 数据结构 ARC & MRC 引用计数 弱引用 自动释放池 循环引用 ios内存布...

  • Dark Corner In ARC

    自从有了ARC,iOSer感觉得到了解放,再也不用考虑内存问题了,最多注意一下循环引用 iOS系统Framewor...

  • block循环引用问题

    在讲block的循环引用问题之前,我们需要先了解一下iOS的内存管理机制和block的基本知识。 iOS的内存管理...

  • iOS - viewDidUnload 被弃用

    为什么viewDidUnload 被弃用 iOS4 和 iOS5系统中,当内存不足,引用收到 MemoryWarn...

  • iOS进阶教程:内存泄露的检测

    iOS内存这块,虽然系统会自动管理,但是自己代码不严谨,非常容易产生内存泄露、内存释放、循环引用这些类似问题。 介...

  • Block中的循环引用

    在讲block的循环引用问题之前,我们需要先了解一下iOS的内存管理机制和block的基本知识 iOS的内存管理机...

  • RxSwift-内存管理

    在iOS中采用的引用计数来管理内存,ARC中,编译阶段,系统会自动向代码中插入内存管理代码,无非就是对对象的引用做...

网友评论

      本文标题:iOS 内存(系统引用的技术)了解

      本文链接:https://www.haomeiwen.com/subject/kdfrfltx.html