对象的引用计数(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. zsh + oh-my-zsh 主题预览

    The Themes robbyrussell the (default) that Robby uses The rest of the themes, in alphabetical order: ...

  2. linux如何以十六进制格式来查看任意文件

    答:vim+xxd 使用方法如下: 1.vim -b file.txt 2.在vim的命令行模式下对文件进行16进制转换 输入:%!xxd 3.在vim的命令行模式下回到正常格式 输入:%!xxd - ...

  3. centos 7 删除 virbr0 虚拟网卡virsh net-list

    这几天研究dubbo,在电脑上装了几台Center os 7虚拟机,最后把提供者部署到虚拟机中时,发现一个有趣的事:在dubbo-admin管理平台上看到两台不同虚拟机中的服务提供者ip都是这个玩意. ...

  4. 如何打开windows的远程桌面

    WINDOWS 2003/XP 系列设置方法 右键点击[我的电脑]选择[属性],进入[系统属性]界面,点击[远程]选项卡,勾选[启用这台计算机上的远程桌面]即可. 2003/XP系统默认只允许计算机a ...

  5. LeetCode——Find Largest Value in Each Tree Row

    Question You need to find the largest value in each row of a binary tree. Example: Input: 1 / \ 3 2 ...

  6. 微服务(一)eureka

    Eureka概述 一个简单的服务注册,服务发现架构 在CAP理论中,eureka选择了ap,作为注册中心,数据可用比数据不一致更重要 逻辑架构图 Eureka特性 1.当注册中心挂了,客户端之间依然可 ...

  7. eclipse 打开 maven项目,出现红色的感叹号

    解决: 选中有感叹号的项目右键,用maven>>update project解决.[然后我再添加java system 类库就可以了]

  8. has~和belongsTo的区别?

    在某一个class里面,class_name所对应的表为主表(父), 关系函数方法里面的第一个参数所对应的表为从属表(子), 即为与主表相关联的表. $has~ 1.外键保存在关联表中:  2.保存时 ...

  9. spring @RequestMapping注解技巧

    @RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一.这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上. 下面我们看看,@Request ...

  10. VisualBrush

    VisualBrush是一种比较特殊的笔刷,它的功能仍然是用来给元素填充图案,但它的内容却可以是各种控件(换言之:它可以使用各种控件来给元素填充图案). 你可以将它理解为一个普通的容器,但在它内部的所 ...