Objective C----手动管理内存和自动管理内存
对象的引用计数(Reference Counting)
正常情况下,当一段代码需要访问某个对象时,该对象的引用的计数加1;当这段代码不再访问该对象时,该对象的引用计数减1,表示这段代码不再访问该对象;当对象的引用计数为0时,表明程序已经不再需要该对象,系统就会回收该对象所占用的内存。
Ø 当程序调用方法名以alloc、new、copy、mutableCopy开头的方法来创建对象时,该对象的引用计数加1。
Ø 程序调用对象的retain方法时,该对象的引用计数加1。
Ø 程序调用对象的release方法时,该对象的引用计数减1。
NSObject 中提供了有关引用计数的如下方法:
Ø —retain:将该对象的引用计数器加1。
Ø —release:将该对象的引用计数器减1。
Ø —autorelease:不改变该对象的引用计数器的值,只是将对象添加到自动释放池中。
Ø —retainCount:返回该对象的引用计数的值。
自动释放池
为了实现被函数、方法返回的对象能被延迟销毁,有如下两种做法:
Ø 程序每次获取并使用完其他方法、函数返回的对象之后,立即调用该对象的release方法将函数、方法返回对象的引用计数减1。
Ø 使用自动释放池进行延迟销毁。
手动内存管理的规则
Ø 调用对象的release方法并不是销毁对象,只是将该对象的引用计数减1;当一个对象的引用计数为0时,系统会自动调用该对象的dealloc方法来销毁该对象。
Ø 当自动释放池被回收时,自动释放池会依次调用池中每个对象的release方法。如果该对象调用release方法后引用计数变为0,那么该对象将要被销毁;否则该对象可以从自动释放池中“活”下来。
Ø 当程序使用alloc、new、copy、mutableCopy开头的方法创建对象后,该对象的引用计数为1,当不再使用该对象时,需要调用该对象的release方法或者autorelease方法。
Ø 如果使用retain方法为对象增加过引用计数,则用完该对象后需要调用release方法来减少该对象的引用计数,并保证retain次数与release次数相等。
Ø 如果通过其他方法获取了对象,且该对象是一个临时对象,如果在自动释放上下文中使用该对象,那么使用完成后无须理会该对象的回收吗,系统会自动回收该对象。如果程序需要保留这个临时对象,则需要手动调用retain来增加该临时对象的引用计数;或者将该临时对象赋值给retain、strong、copy指示符修饰的属性。
Ø 在Cocoa或iOS的事件循环中,每个事件处理方法执行之前会创建自动释放池,方法执行完成后会回收自动释放池。如果希望自动释放池被回收后,池中某些对象能“活”下来,程序必须增加该对象的引用计数,保证该对象的引用计数大于它调用autorelease的次数。
自动引用计数(Automatic Reference Counting)
iOS 5引入ARC机制
选中TARGETS分类下的项目名,在编辑区上方单击Build Settings标签页,在此标签页搜索Objective-C
AutomaticReference Counting选项,如果将该选项设为Yes,表明启用ARC,设为No则表明关闭ARC选项。
为了单独关闭某个文件的ARC机制,可单击图1所示窗口上方的Build Phases标签页,然后展开Compile Sources分类列表,即可看到项目中所有的源代码。接下来就可以对指定的源代码添加-fno-objc-arc编译选项,如图2所示。
Objective C----手动管理内存和自动管理内存的更多相关文章
- Oracle DB 自动管理共享内存
• 启用Oracle Enterprise Manager (EM) 内存参数 • 设置自动优化的内存参数 • 使用手动优化的SGA 参数覆盖最小大小 • 使用SGA Advisor 设置SGA_TA ...
- Delphi内存管理(Integer、Boolean、Record、枚举等都是在作用域内编译器自动申请内存,出了作用域自动释放;另外,字符串、Variant、动态数组、接口也是由Delphi自动管理)
一.什么是堆.栈? 程序需要的内存空间分为 heap(堆) 和 stack(栈),heap 是自由存储区, stack 是自动存储区,使用 heap 需要手动申请.手动释放, stack 是自动申请. ...
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.2.HotSpot虚拟机对象探秘
对象的创建过程 1.加载类 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载. 解析和初始化过. 如果没有,那必须 ...
- 【转载】Unity 优雅地管理资源,减少占用内存,优化游戏
转自:星辰的<Unity3D占用内存太大的解决方法> 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D ...
- 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点
小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...
- MATLAB学习之内存溢出的管理方法
今天用Matlab跑程序,由于数据量太大,又出现 Out of memory. Type HELP MEMORY for your options.的问题.看到这篇文章非常实用,转过来方便查阅~ 用 ...
- oracle结构-内存结构与动态内存管理
内存结构与动态内存管理 内存是影响数据库性能的重要因素. oracle8i使用静态内存管理,即,SGA内是预先在参数中配置好的,数据库启动时就按这些配置来进行内在分配,oracle10g引入了动态内存 ...
- 【uTenux实验】内存池管理(固定内存池和可变内存池)
1.固定内存池管理实验 内存管理是操作系统的一个基础功能.uTenux的内存池管理函数提供了基于软件的内存池管理和内存块分配管理.uTenux的内存池有固定大小的内存池和大小可变的内存池之分,它们被看 ...
- 内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。
(1)内存管理函数与内存管理运算符的区别 内存管理函数有内存分配函数,malloc calloc realloc 以及内存释放函数free. 内存管理运算符有new 和delete. 两种内存管理方式 ...
随机推荐
- rocketmq事务消息
rocketmq事务消息 参考: https://blog.csdn.net/u011686226/article/details/78106215 https://yq.aliyun.com/art ...
- flume 1.7 安装与使用
Flume安装 系统要求: 需安装JDK 1.7及以上版本 1. 下载二进制包 下载页面:http://flume.apache.org/download.html 1.7.0下载地址:http:// ...
- 拓扑排序 - hdu 1285(普通和优先队列优化)
2017-09-12 19:50:58 writer:pprp 最近刚开始接触拓扑排序,拓扑排序适用于:无圈图的顶点的一种排序, 用来解决有优先级别的排序问题,比如课程先修后修,排名等. 主要实现:用 ...
- NPM Scripts -- onchange parallelshell
Watch for changes to the styles.scss file and automatically compile it to the css file. Run multiple ...
- mac下安装c++开发环境
mac下安装c++开发环境 1 注册apple id 按照apple注册步骤注册apple id,我注册时遇到如下问题 apple store完成创建apple id步骤中,选择付款方式和账单地址后, ...
- i++为什么是线程不安全的
主要是因为i++这个操作不是原子性的,它会编译成 i = i +1: 其实是做了3个步骤,一个是读取,修改,写入 .所以会出现多线程访问冲突问题. 可以结合Java内存模型来进行说明.
- 前端打印功能实现及css设置
首先是使用下边代码,实现js局部打印功能.参数dom为需要打印的节点,为了保证页面功能的单一性,最好弹出一个新的预览页面完成打印功能. function print(dom){ var body = ...
- 实用SQL语句
sp_depends t_im_flow 获取到与这个表有关系的存储过程.触发器.函数.视图等.
- Kafka、RabbitMQ、RocketMQ、ActiveMQ 17 个方面综合对比
本文将从,Kafka.RabbitMQ.ZeroMQ.RocketMQ.ActiveMQ 17 个方面综合对比作为消息队列使用时的差异.(欢迎加入Java程序员群:630441304,一起学习交流会) ...
- idea maven install时,打包找不到微服务common中公用的包
如题:其实很简单,在打包之前要先使项目通过编译,编译通过之后再打包就可以了. 附idea编译键: