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

  • 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. python读txt转array_np.array和txt文件的转换
  2. Combinations leetcode java
  3. hive mysql hdfs关系_Hive中的数据库、表、数据与HDFS的对应关系
  4. 采用晶体管为基本元件的计算机发展阶段是,计算机应用基础知识点
  5. 南通大学计算机组成原理期末考试题,南通大学计算机组成原理期末考试范围.docx...
  6. 平衡二叉树搜索二叉树
  7. WinPE作为启动硬盘
  8. CentOS Linux安装telnet服务
  9. 伪静态设置php,php伪静态设置
  10. 嵌入式-第一季-第4课
  11. android原生browser分析(一)--Application
  12. 10. python-es-8.3.3-IP范围聚合ip_range
  13. S2B2C模式有何优势?S2B2C电商系统赋能皮革企业渠道,提升供应链管理效率
  14. RustScan(端口扫描器)
  15. android N编译
  16. linux数据库哪个难,11 月数据库排名公布:前三难撼动
  17. SDR# (SDRSharp)代码讲解 (二)
  18. 如何修改Maven仓库地址为阿里云仓库
  19. Attacking Black-box Recommendations viaCopying Cross-domain User Profiles
  20. 集线器、交换机以及路由器异同 + 冲突域和广播域详解

热门文章

  1. android glide缺少方法,android - 无法膨胀且找不到类android支持设计的行为BottomSheetBehavior - 堆栈内存溢出...
  2. 弗洛伊德(Floyd)算法之两点之间的最短距离问题
  3. 毕业论文Word格式订正技巧
  4. 加速linux开机速度 systemctl
  5. 16款设计师必知晓的思维导图工具
  6. 金蝶BOS开发代码调用过程
  7. PPT2007将Excel图表转为图片
  8. TFTP服务器与客户端的安装
  9. Jsp中的forward 和 redirect
  10. 获取网页上没有下载链接的视频音频资源 火狐浏览器插件 Video DownloadHelper