系统提供的有不同的内存管理方案,大致有如下三种:

  • 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中判断对象的几个条件:

  1. isa.nonpointer,32位系统和64位系统isa的结构不同,为0表示isa直接指向对象的class,为1表示isa不是直接指向class
  2. 是否有注册weak引用表
  3. 是否有association关联属性
  4. 是否有c++析构
  5. 是否有引用计数表

在object_dispose中调用objc_destructInstance主要做了以下操作:

  1. object_cxxDestruct,这里主要是用于释放对象的实例变量
  2. _object_remove_assocations,移除掉所有关联属性,即通过objc_setAssociatedObject添加的关联属性
  3. clearDeallocating,先清空weak变量表且将所有weak引用指向nil,然后清空引用计数表。

最后通过free函数清除对象内存。

iOS中内存管理方案相关推荐

  1. 【iOS系列】-iOS中内存管理

    iOS中创建对象的步骤: 1,分配内存空间,存储对象 2,初始化成员变量 3,返回对象的指针地址 第一:非ARC机制: 1,对象在创建完成的同时,内部会自动创建一个引用计数器,是系统用来判断是否回收对 ...

  2. iOS中内存管理的问题——堆和栈

    计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同: 1)栈区(stack)由编译器自动分配并释放,一般保存函数的参数值.局部变量 2)堆区(heap)由程序员分 ...

  3. iOS中内存管理问题

    mrc 在学习的时候一致有一个地方不理解,为什么变量retain之后又release,现在算是明白了: - (void)setFoo:(Foo *)foo{if (_foo != foo) {//_f ...

  4. iOS 中内存的管理?

    不同的系统版本对 App 运行时占用内存的限制不同,系统版本的升级也会增加占用的内存,同时 App 功能的增多也会要求越来越多的内存. 然而,移动设备的内存资源是有限的,当 App 运行时占用的内存大 ...

  5. 内存管理相关【内存布局内存管理方案】

    iOS系统下的内存布局 最上面是内核区,最下面是保留区,中间是给程序加载的空间. 从高地址到低地址依次为内核区.栈.堆.静态全局区(未初始化区域.bss和已初始化区域.data).代码区.保留区: 程 ...

  6. iOS中的HotFix方案总结详解

    iOS中的HotFix方案总结详解 相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dy ...

  7. 一个基于链表的内存管理方案

    在Open×××中,一种很不错的内存管理方案是基于链表的,该方案的实现使用了一个gc_arena结构体,该结构体的作用就是将所有的动态分配的内存块收集汇集起来,然后就可以在一个地方统一释放,c语言对动 ...

  8. iOS 的内存管理和虚拟内存机制具体是怎么运作的?

    iOS 的内存管理和虚拟内存机制具体是怎么运作的? 众所周知,iOS 设备的内存普遍较小.但就最终用户体验而言,流畅舒服.想知道虚拟内存在其中是否发挥了作用? 3 条评论 分享 按投票排序按时间排序 ...

  9. Python中内存管理的问题

    Python中内存管理的问题 pyqtgraph实时显示占用内存 删除变量释放内存 后记 我的环境是python3+SublimeText.python是解释型语言,平常对内存关注得不多. pyqtg ...

最新文章

  1. pandas使用insert函数将dataframe特定数据列移动到第一列实战:Move a Column to First Position
  2. 第1章python基础语法1
  3. 织梦html编辑器功能在哪,织梦dede自带编辑器替换百度ueditor编辑器
  4. 程序员,你也该为自己想想未来
  5. Android利用Volley异步加载(JSON和图片)完整示例
  6. (06)System Verilog 静态变量与动态变量区别
  7. 博纳影业集团副总裁黄巍逝世 享年52岁
  8. tensorflow : 队列管理 FIFOQueue amp;amp; RandomShuffleQueue
  9. 开源面向对象数据库 db4o 之旅,第 1 部分: 初识 db4o
  10. 黑苹果安装记录(史上最简单的安装教程——小白福利)
  11. 虚拟偶像春天来临,谁能从中脱颖而出?
  12. vue常用的事件修饰符
  13. 旋转木马--利用html5和css3制作好看的图片3D旋转效果
  14. 阿里云DDoS防护是如何工作的?
  15. 全球最专业心理测试软件,据说是全球最准的心理测试
  16. Android studio app启动时默认启动页面为自定义界面
  17. Day46(列表标签,表格标签,表单标签,css的引入方式,css选择器)
  18. 学习笔记——使用Unity Network组件开发联机游戏
  19. javaSE常用类(二)—— 日期类
  20. 51单片机入门教程_独立按键控制系列

热门文章

  1. ps 填充画板背景色
  2. python适合做网页吗_python是否适合网页编程详解
  3. db2还原备份文件详细教程
  4. 2018 新浪校招 PHP实习生 电话面试总结
  5. vue实现PC端调用摄像头拍照人脸录入、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式
  6. 20年前,我用川普视频月入5万
  7. 如何将WORD中的公式转为图片
  8. oracle11g rac转换单机,oracle11g rac RMAN备份恢复至单机
  9. 一次ORA-3136的处理
  10. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'user' 附近有语法错误