博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC语法6——内存管理之引用计数器(retain,release)
阅读量:5167 次
发布时间:2019-06-13

本文共 1139 字,大约阅读时间需要 3 分钟。

OC内存管理:

  一、引用计数器:

  Java有垃圾回收机制(Garbage Collection,GC)。也就是说当我们创建对象后,不需要考虑回收内存的事,Java的垃圾回收机制会自动销毁该对象,回收它占用的内存。

  但OC没有垃圾回收机制,需要开发者手动销毁创建的对象,收回内存。OC中没有垃圾回收机制,而是通过“引用计数器”来管理内存的。

  引用计数器:OC中的对象内部都有一个记录有关对象内存状态的整数,把这个整数就叫做引用计数器。

  当调用alloc,new,copy等创建新对象时,计数器置为1;当调用retain时计数器便加1;当调用release是计数器便减1;

  当计数器为0时,系统会自动调用dealloc方法,销毁该对象,释放占用的内存。

————————————————————————————————————————

  二、分析对象的引用计数器:

  因为没有Xcode写代码的例子,所以先把“内存管理的原则”的总结放在开学后。在这里先列出大纲:

  1.通过引用计数器分析对象不同阶段引用计数器的值(retainCount);

  2.内存管理的原则是“谁创建,谁释放”,怎么深刻理解这句话?

  真实开发环境中对象的调用时错综复杂的,那我们该如何进行内存管理,该如何理解“谁创建,谁释放”?(set方法里调用retain,重写的realloc里调用release

 

  三、自动释放池:

  为了便捷,OC也提供了一种半自动回收内存机制,即“自动释放池”。

  首先通过@autoreleasepool{ }定义一个代码块,这就是“自动释放池”;

  然后在创建对象时只要调用autorelease方法,则就相当于把该对象放入自动释放池。

  当代码块执行完后,会一次性的对放入其中的所有对象调用一次release方法,从而可以起到自动释放内存的功能。

 

  自动释放池的本质:

  自动释放池和Java的垃圾回收机制是不同的。它的本质是对放入“池”中的对象统一调用一次release方法。

  所以,也需要注意,并不是说放入池中的对象就一定会被销毁。(假如该对象调用过retain方法,放入池时计数器为2,则通过自动释放池统一调用release后,计数器为1,该对象并不会被销毁)

  因为自动释放池延迟了对象的销毁,而进行统一销毁。当对象很多或者占很大内存时不宜采用自动释放池,不应该让他们长期驻留。

  

  需要说明的是,OC类库中的静态方法一般不需要手动释放,内部已经调用了autorelease方法。

  

 

转载于:https://www.cnblogs.com/wangerxiansheng/p/4296826.html

你可能感兴趣的文章
OS X中crt中文乱码
查看>>
Session And Caching Issues in Windows Azure
查看>>
Tomcat 基础二
查看>>
Python 操作Mysql 简单的增删改查
查看>>
C 链表实现多项式
查看>>
下拉渐显菜单
查看>>
外边距崩塌
查看>>
SurfaceOutput
查看>>
UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释
查看>>
Kali的源得数字验证问题
查看>>
Vue+jquery上拉加载
查看>>
关于mysqli_free_result($result)报错
查看>>
互联网数据分享平台
查看>>
[LeetCode] 260 - Single Number III
查看>>
CodeBlocks 配色方案
查看>>
css居中(水平+垂直,定宽/高+不定宽/高,边距+浮动+定位)
查看>>
检测数据类型的四种方法
查看>>
适合于图像处理方向的SCI期刊杂志列表【转】
查看>>
读博士最后都会明白的八个道理
查看>>
presto更改端口遇到的问题
查看>>