对象的引用计数(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----手动管理内存和自动管理内存的更多相关文章

  1. Oracle DB 自动管理共享内存

    • 启用Oracle Enterprise Manager (EM) 内存参数 • 设置自动优化的内存参数 • 使用手动优化的SGA 参数覆盖最小大小 • 使用SGA Advisor 设置SGA_TA ...

  2. Delphi内存管理(Integer、Boolean、Record、枚举等都是在作用域内编译器自动申请内存,出了作用域自动释放;另外,字符串、Variant、动态数组、接口也是由Delphi自动管理)

    一.什么是堆.栈? 程序需要的内存空间分为 heap(堆) 和 stack(栈),heap 是自由存储区, stack 是自动存储区,使用 heap 需要手动申请.手动释放, stack 是自动申请. ...

  3. 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.2.HotSpot虚拟机对象探秘

    对象的创建过程 1.加载类 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载. 解析和初始化过. 如果没有,那必须 ...

  4. 【转载】Unity 优雅地管理资源,减少占用内存,优化游戏

    转自:星辰的<Unity3D占用内存太大的解决方法> 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D  ...

  5. 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点

    小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...

  6. MATLAB学习之内存溢出的管理方法

    今天用Matlab跑程序,由于数据量太大,又出现 Out of memory. Type HELP MEMORY for your options.的问题.看到这篇文章非常实用,转过来方便查阅~ 用 ...

  7. oracle结构-内存结构与动态内存管理

    内存结构与动态内存管理 内存是影响数据库性能的重要因素. oracle8i使用静态内存管理,即,SGA内是预先在参数中配置好的,数据库启动时就按这些配置来进行内在分配,oracle10g引入了动态内存 ...

  8. 【uTenux实验】内存池管理(固定内存池和可变内存池)

    1.固定内存池管理实验 内存管理是操作系统的一个基础功能.uTenux的内存池管理函数提供了基于软件的内存池管理和内存块分配管理.uTenux的内存池有固定大小的内存池和大小可变的内存池之分,它们被看 ...

  9. 内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。

    (1)内存管理函数与内存管理运算符的区别 内存管理函数有内存分配函数,malloc calloc realloc 以及内存释放函数free. 内存管理运算符有new 和delete. 两种内存管理方式 ...

随机推荐

  1. LeetCode——3Sum

    1. Question Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? ...

  2. 直播P2P技术2-低延迟模型

    低延迟模型 由上一篇文章我们知道:网状拓扑虽最大化利用了所有节点的资源却无法降低数据延迟,而树状拓扑尽管数据传输效率高,延迟低,但只利用了少部分节点的带宽资源,不适应高码率的直播P2P网络. 那么如何 ...

  3. ThinkPHP开发笔记-模型

    1.模型定义.在ThinkPHP中,可以无需进行任何模型定义.只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的,因此ThinkPHP在模型上有很多的灵活和方便性,让你无需因为表太多而烦恼. ...

  4. Git常用命令和Git团队使用规范指南

    转自:https://wsgzao.github.io/post/git/ 前言 在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git.它的出现改变了 ...

  5. 最简js深浅拷贝说明

    1.浅拷贝 浅拷贝是拷贝引用,拷贝后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响.  浅拷贝分两种情况: 1.直接拷贝源对象的引用 2. 源对象拷贝实例,但其属性对象(类型为Object, ...

  6. [javascript]jquery选择器笔记

    技术文档 中文:http://jquery.cuishifeng.cn/ 英文:http://api.jquery.com/category/selectors/ 分类 基本选择器 层次选择器 过滤选 ...

  7. flask学习(五):使用配置文件

    1. 新建一个config.py文件 2. 在主app文件中导入这个文件,并且配置到app中,示例代码如下: import config app.config.from_object(config) ...

  8. 已经安装了node和npm,输入node -v 未找到命令

    昨天虚拟机上安装了nvm.node.npm,今天打开输入node -v,就显示未找到命令 输入nvm --version 发现还是有nvm版本的,不然都要以为刚配好的虚拟机又要重新安装... 再输入 ...

  9. Symmetrical Network Acceleration with EBS 12

    Andy Tremayne, my esteemed colleague and fellow blogger, has published a new whitepaper that discuss ...

  10. 解决在for循环内判断条件多次执行

    最近遇到的这个问题,就是在for循环内if判断的条件会多次执行. 例如,在返回的30数据中,a条目是第7条则会进行30次判断,弹出29次查无数据,也就是要点击29次关闭alert,很是让人不爽. 有了 ...