iOS 理解引用计数

一 简介

    OC 语言使用引用计数来管理内存每个对象都有个可以递增或递减的计数器,如果想某个对象继续存活,那就递增其引用计数,用完之后,就递减其计数,计数变为0,就销毁。

二 引用计数工作原理

NSObject 协议声明了下面三个方法用于操作计数器,以递增或递减其值

retain 递增引用计数

release 递减引用计数

autorelease 稍后清理“自动释放池”时,在递减引用计数

为避免在不经意间使用了无效对象,一般调用完release 之后都会清空指针。这就能保证不会出现可能指向高无效对象的指针,这种指针通常称为 dangling pointer 。

三 return cycle

使用引用计数机制时,经常要注意的一个问题就是 return cycle,就是呈环形状相互引用多个对象,这将导致内存泄露,因为循环中的对象其保留计数不会降为0。对循环中的每一个对象来说,至少有另外一个对象引用着它,垃圾回收器会把相互引用的对象全部回收走,而OC 引用技术架构中,则享受不到这种便利,通常采用 weak reference 来解决次问题,从而避免内存泄露

时间: 2024-10-07 14:26:48

iOS 理解引用计数的相关文章

iOS中引用计数内存管理机制分析

在 iOS 中引用计数是内存的管理方式,尽管在 iOS5 版本号中.已经支持了自己主动引用计数管理模式.但理解它的执行方式有助于我们了解程序的执行原理.有助于 debug 程序. 操作系统的内存管理分成堆和栈. 在堆中分配的内存,都试用引用计数模式:在栈中则不是. NSString 定义的对象是保存在栈中,所以它没有引用计算.看一些书上说它的引用计算会是 fffffffff 最大整数.測试的结果显示它是- 1. 对该对象进行 retain 操作.不好改变它的 retainCount 值. Mut

iOS中引用计数内存管理机制分析总结(NSString引用计数为-1的情况)

在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序.   操作系统的内存管理分成堆和栈. 在堆中分配的内存,都适用引用计数模式:在栈中则不是. NSString 定义的对象是保存在栈中,所以它没有引用计数,不是通过引用计数对内存进行管理的.之前我在一篇博客上看,说常量的引用计数会是一个很大的整数,测试的结果显示它是-1. 对该对象进行 retain 操作,不好改变它的 reta

第29条:理解引用计数

自动引用计数(Automatic Reference Counting, ARC) 垃圾收集器: 从Mac OS X 10.8开始,“垃圾收集器”(gargae collector)已经正式废弃了. 每个对象都有个计数器,用以表示当前有多少个事物想令此对象继续存活下去.叫做“保留计数”(retain count),也可以叫“引用计数”(reference count). 由三个方法操作计数器: reatain 递增 release 递减 autorelease 递减,自动释放池(autorele

第29条:理解引用计数

第5章 内存管理 在 Objective-C 这种面向对象语言里,内存管理是个重要概念.要想一门语言写出内存使用效率高而且又没有 bug 的代码,就得掌握其内存管理模型的种种细节. 一旦理解了这些规则,你就会发现,其实 Objective-C 的内存管理没那么复杂,而且有了 "自动引用计数"(Automatic Reference Counting, ARC)之后,就变得更为简单了.ARC 几乎把所有内存管理事宜都交由编译器来决定,开发者只需专注于业务逻辑. 本条要点:(作者总结) O

Objective-C内存管理之引用计数

初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存管理这一部分说的非常简单,只有三条准则: 当你使用new.alloc或copy方法创建一个对象时,该对象的保留指针为1,当不再使用该对象的时候,你应该想该对象发送一条release或autorelease消息,这样,该对象在其寿命结束时将被销毁. 当你通过其他方法获得一个对象时,假设该对象的保留计数

iOS内存管理机制解析之MRC手动引用计数机制

前言: iOS的内存管理机制ARC和MRC是程序员参加面试基本必问的问题,也是考察一个iOS基本功是 否扎实的关键,这样深入理解内存管理机制的重要性就不言而喻了. iOS内存管理机制发展史 iOS 5以前 :MRC(手动引用计数) iOS 5及以后:ARC (自动引入计数) MRC机制时代 "谁开辟申请,谁及时合理释放" 面对自己申请的内存空间是要及时进行回收的: 不及时释放会造成什么结果? 对象存储在栈上,可能会大量的占用内存,内存不足造成程序闪退(也就是所说的内存泄露) 不合理释放

IOS开发语言Swift入门连载---自动引用计数

IOS开发语言Swift入门连载-自动引用计数 Swift使用自动引用计数(ARC)这一机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 的内存管理机制会一直起着作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的内存. 然而,在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息.本章描述了这些情况,并且为你示范怎样启用 ARC 来管理你的应用程序的内存. 注意 引用计数仅仅应用于类的实例.结构体和枚举类型是值类型,不是引用类

深入理解 PHP7 中全新的 zval 容器和引用计数机制

深入理解 PHP7 中全新的 zval 容器和引用计数机制 最近在查阅 PHP7 垃圾回收的资料的时候,网上的一些代码示例在本地环境下运行时出现了不同的结果,使我一度非常迷惑. 仔细一想不难发现问题所在:这些文章大多是 PHP5.x 时代的,而 PHP7 发布后,采用了新的 zval 结构,相关的资料也比较贫瘠,所以我结合一些资料做了一个总结, 主要侧重于解释新 zval 容器中的引用计数机制 ,如有谬误,还望不吝指教. PHP7 中新的 zval 结构 明人不说暗话,先看代码! struct 

OSG下的引用计数指针(Reference Pointers)的理解

使用OpenSceneGraph会经常见到这样的代码 osg::ref_ptr<osg::Node> nodeRptr = new osg::Node; osg::ref_ptr即为Reference counted objects 每次使用时自动递增,用完后自动递减,当最后一个 计数器变为0,对象自动销毁. ref_ptr模板类型继承自Referenced类,Referenced类有三个基本函数: void ref()增加引用计数 void unref()减少引用计数 int getRefe