iOS中内存管理方案
系统提供的有不同的内存管理方案,大致有如下三种:
- TaggedPointer (对于一些小对象,比如说NSNumber,NSString等采用此种方案)
- NONPOINTER_ISA (64位架构下iOS应用程序)
- 散列表 (散列表为复杂的数据结构,包含了引用计数表和弱引用表)
TaggedPointer
以下2段代码能发生什么事?有什么区别?
- (void)setName:(NSString *)name
{if (_name != name) {[_name release];_name = [name retain];}
}- (void)viewDidLoad {[super viewDidLoad];dispatch_queue_t queue = dispatch_get_global_queue(0, 0);for (int i = 0; i < 1000; i++) {dispatch_async(queue, ^{// 加锁self.name = [NSString stringWithFormat:@"abcdefghijk"];// 解锁});}// dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//
// for (int i = 0; i < 1000; i++) {
// dispatch_async(queue, ^{
// self.name = [NSString stringWithFormat:@"abc"];
// });
// }// NSString *str1 = [NSString stringWithFormat:@"abcdefghijk"];// NSLog(@"%p", str1);
}
当赋值为abc的时候,会当成是一个TaggedPointer,直接修改成员变量,故不会报错,当赋值为abc的时候,会当成是一个NONPOINTER_ISA,多条线程同时操作一个属性,在nonatomic下面会有多线程的问题,如果要解决这个问题,可以把属性改成atomic。(就是判断isTaggedPointer,在mac平台,指针的最低有效位是1,就是TaggedPointer;在ios平台,指针的最高有效位是1,就是TaggedPointer)
NONPOINTER_ISA
indexed:0:这里存的是当前对象的类对象地址;1:除地址外还有内存管理方面数据
has_assoc:当前对象是否有关联对象
has_cxx_dtor:当前对象是否有使用到C++方面的内容
shiftcls:当前对象类对象的指针地址
wealy_referenced:是否有相应的弱引用指针
deallocting:是否正在进行dealloc操作
has_sidetable_rc:是否内存管理数据过大,过大或用sidetable储存
extra_rc:储存内存管理相关
散列表方式
alloc
用alloc的时候并没有引用计数+1,通过一系列调用,最终调用c函数的calloc;
dealloc:
可以看到执行过程比较简单,_objc_rootDealloc -> rootDealloc -> objc_object::rootDealloc,
在objc_object::rootDealloc中判断对象的几个条件:
- isa.nonpointer,32位系统和64位系统isa的结构不同,为0表示isa直接指向对象的class,为1表示isa不是直接指向class
- 是否有注册weak引用表
- 是否有association关联属性
- 是否有c++析构
- 是否有引用计数表
在object_dispose中调用objc_destructInstance主要做了以下操作:
- object_cxxDestruct,这里主要是用于释放对象的实例变量
- _object_remove_assocations,移除掉所有关联属性,即通过objc_setAssociatedObject添加的关联属性
- clearDeallocating,先清空weak变量表且将所有weak引用指向nil,然后清空引用计数表。
最后通过free函数清除对象内存。
iOS中内存管理方案相关推荐
- 【iOS系列】-iOS中内存管理
iOS中创建对象的步骤: 1,分配内存空间,存储对象 2,初始化成员变量 3,返回对象的指针地址 第一:非ARC机制: 1,对象在创建完成的同时,内部会自动创建一个引用计数器,是系统用来判断是否回收对 ...
- iOS中内存管理的问题——堆和栈
计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同: 1)栈区(stack)由编译器自动分配并释放,一般保存函数的参数值.局部变量 2)堆区(heap)由程序员分 ...
- iOS中内存管理问题
mrc 在学习的时候一致有一个地方不理解,为什么变量retain之后又release,现在算是明白了: - (void)setFoo:(Foo *)foo{if (_foo != foo) {//_f ...
- iOS 中内存的管理?
不同的系统版本对 App 运行时占用内存的限制不同,系统版本的升级也会增加占用的内存,同时 App 功能的增多也会要求越来越多的内存. 然而,移动设备的内存资源是有限的,当 App 运行时占用的内存大 ...
- 内存管理相关【内存布局内存管理方案】
iOS系统下的内存布局 最上面是内核区,最下面是保留区,中间是给程序加载的空间. 从高地址到低地址依次为内核区.栈.堆.静态全局区(未初始化区域.bss和已初始化区域.data).代码区.保留区: 程 ...
- iOS中的HotFix方案总结详解
iOS中的HotFix方案总结详解 相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dy ...
- 一个基于链表的内存管理方案
在Open×××中,一种很不错的内存管理方案是基于链表的,该方案的实现使用了一个gc_arena结构体,该结构体的作用就是将所有的动态分配的内存块收集汇集起来,然后就可以在一个地方统一释放,c语言对动 ...
- iOS 的内存管理和虚拟内存机制具体是怎么运作的?
iOS 的内存管理和虚拟内存机制具体是怎么运作的? 众所周知,iOS 设备的内存普遍较小.但就最终用户体验而言,流畅舒服.想知道虚拟内存在其中是否发挥了作用? 3 条评论 分享 按投票排序按时间排序 ...
- Python中内存管理的问题
Python中内存管理的问题 pyqtgraph实时显示占用内存 删除变量释放内存 后记 我的环境是python3+SublimeText.python是解释型语言,平常对内存关注得不多. pyqtg ...
最新文章
- pandas使用insert函数将dataframe特定数据列移动到第一列实战:Move a Column to First Position
- 第1章python基础语法1
- 织梦html编辑器功能在哪,织梦dede自带编辑器替换百度ueditor编辑器
- 程序员,你也该为自己想想未来
- Android利用Volley异步加载(JSON和图片)完整示例
- (06)System Verilog 静态变量与动态变量区别
- 博纳影业集团副总裁黄巍逝世 享年52岁
- tensorflow : 队列管理 FIFOQueue amp;amp; RandomShuffleQueue
- 开源面向对象数据库 db4o 之旅,第 1 部分: 初识 db4o
- 黑苹果安装记录(史上最简单的安装教程——小白福利)
- 虚拟偶像春天来临,谁能从中脱颖而出?
- vue常用的事件修饰符
- 旋转木马--利用html5和css3制作好看的图片3D旋转效果
- 阿里云DDoS防护是如何工作的?
- 全球最专业心理测试软件,据说是全球最准的心理测试
- Android studio app启动时默认启动页面为自定义界面
- Day46(列表标签,表格标签,表单标签,css的引入方式,css选择器)
- 学习笔记——使用Unity Network组件开发联机游戏
- javaSE常用类(二)—— 日期类
- 51单片机入门教程_独立按键控制系列
热门文章
- ps 填充画板背景色
- python适合做网页吗_python是否适合网页编程详解
- db2还原备份文件详细教程
- 2018 新浪校招 PHP实习生 电话面试总结
- vue实现PC端调用摄像头拍照人脸录入、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式
- 20年前,我用川普视频月入5万
- 如何将WORD中的公式转为图片
- oracle11g rac转换单机,oracle11g rac RMAN备份恢复至单机
- 一次ORA-3136的处理
- Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'user' 附近有语法错误