首页 / 知识
关于iphone:了解使用Cocoa和Objective-C的引用计数
2023-04-11 22:30:00

Understanding reference counting with Cocoa and Objective-C我刚刚开始了解一下Objective-C和Cocoa,以了解如何使用iPhone SDK。我对C的 (否则,你读了什么帮助你得到它?) 让我们从 在cocoa中,每个对象跟踪被引用的次数(具体来说, 这与 有时会令人困惑的是,知道在什么情况下你应该称之为 对象创建示例:
现在是 需要注意的是(按照约定),所有对象创建类方法都返回一个自动释放的对象。例如,在下面的示例中,变量"s"的引用计数为1,但在事件循环完成后,它将被销毁。
如果您想挂起这个字符串,您需要显式调用 考虑以下(非常人为的)代码,您将看到需要
我意识到所有这些都有点令人困惑——不过,在某个时候,它会点击。以下是一些参考资料:
如果您了解保留/发布的过程,那么有两个黄金规则对于已建立的Cocoa程序员来说是显而易见的,但不幸的是,对于新来者来说,很少清楚地阐明这一点。 如果返回一个对象的函数的名称中有 如果它的名称中没有这些单词中的一个,那么对象就属于其他人。如果希望在函数结束后保留对象,则必须调用 在您自己创建的函数中,您也应该遵循这个约定。 (吹毛求疵者:是的,不幸的是,有一些API调用是这些规则的例外,但它们很少)。 如果您正在为桌面编写代码,并且可以以Mac OS X 10.5为目标,那么至少应该考虑使用Objective-C垃圾收集。它真的会简化你的大部分开发——这就是为什么苹果公司把所有的努力都放在了创建它的第一位,并使它运行良好。 对于不使用GC时的内存管理规则:
通常情况下, 除了您可能会考虑降低50美元并获得Hillegass图书之外,我不会在保留/发布的具体内容中添加其他内容,但我强烈建议您在开发应用程序(甚至是您的第一个应用程序)的早期就开始使用仪器工具!。为此,请运行->从性能工具开始。我将从泄漏开始,这只是许多可用仪器中的一个,但当您忘记释放时,它将有助于向您展示。你将得到多少信息,这让人望而却步。但是,请查看本教程以快速起床:Cocoa教程:使用仪器修复内存泄漏 实际上,尝试强制泄漏可能是更好的方法,反过来,学习如何防止泄漏!祝你好运!) 和以往一样,当人们开始尝试重新表述参考资料时,他们几乎总是会出错或提供不完整的描述。 苹果公司为Cocoa提供了一份完整的《Cocoa内存管理系统内存管理编程指南》,最后对内存管理规则进行了简要而准确的总结。 Joshua(6591)-Mac OS X 10.5中的垃圾收集功能看起来很酷,但不适用于iPhone(或者如果您希望应用程序在Mac OS X 10.5之前的版本上运行)。 另外,如果您正在编写一个库或一些可以重用的东西,那么使用gc模式会将使用代码的任何人锁定为也使用gc模式,因此我理解,任何试图编写广泛可重用代码的人都倾向于手动管理内存。 Objective-C使用引用计数,这意味着每个对象都有一个引用计数。创建对象时,其引用计数为"1"。简单地说,当一个对象被引用(即存储在某个地方)时,它会被"保留",这意味着它的引用计数会增加一个。当一个对象不再需要时,它会被"释放",这意味着它的引用计数会减少一个。 当对象的引用计数为0时,对象将被释放。这是基本参考计数。 对于某些语言,引用会自动增加和减少,但Objective-C不是这些语言中的一种。因此,程序员负责保留和释放。 编写方法的典型方法是:
需要记住在代码中释放任何获得的资源的问题既单调又容易出错。Objective-C引入了另一个概念,旨在使这更容易:自动释放池。自动释放池是安装在每个线程上的特殊对象。如果你查一下NSAutoReleasePool,它们是一个相当简单的类。 当对象收到发送给它的"autorelease"消息时,该对象将查找当前线程堆栈上的任何autorelease池。它将把对象作为一个对象添加到列表中,以便在将来的某个时候向其发送一条"释放"消息,这通常是在池本身被释放的时候。 使用上面的代码,您可以通过说:
因为对象是自动释放的,所以我们不再需要在它上面显式地调用"release"。这是因为我们知道一些自动释放池稍后会为我们做这件事。 希望这有帮助。维基百科的这篇文章非常适合参考计数。有关自动释放池的详细信息,请参阅此处。另外请注意,如果您正在为Mac OS X 10.5和更高版本构建,您可以告诉Xcode在启用垃圾收集的情况下进行构建,这样您就可以完全忽略retain/release/autorelease。 我通常收集的可可记忆管理文章: 可可存储器管理
自动释放不保留对象。autorelease只是将其放入队列中,以便稍后释放。您不希望在那里有一个发布声明。 IDeveloperTV网络提供免费的屏幕广播 目标C中的记忆管理 NilObject的回答是一个很好的开始。以下是一些关于手动内存管理的补充信息(在iPhone上是必需的)。 如果您个人使用一个对象,它会附带一个引用计数1。当不再需要时,您有责任在之后进行清理,可以致电 autorelease主要用于当您有一个方法需要返回有问题的对象时(这样您就不能手动释放它,否则您将返回一个nil对象),但您也不想保留它。 如果获取的对象没有调用alloc/init来获取它——例如:
但如果你想抓住这个对象,你需要调用[foo retain]。否则,它可能会得到 上面的答案清楚地重述了文档中的内容;大多数新人遇到的问题是未记录的案例。例如:
一般来说,新的Cocoa程序员搞砸的方式是不了解哪些例程返回带有 以下是Cocoa内存管理非常简单的规则中的一个片段:
第一颗子弹说:如果你打电话给 第二个要点是:如果您使用一个方便的构造函数,并且您需要该对象挂在周围(就像后面要绘制的图像一样),那么您需要保留(然后再释放)它。 第三个应该是不言而喻的。 还有很多关于可可豆的好信息:
正如一些人已经提到的,苹果的内存管理介绍是迄今为止最好的开始。 我还没有看到一个有用的链接,那就是实用的内存管理。如果你仔细阅读,你会发现它在苹果文档的中间,但它值得直接链接。这是一个关于记忆管理规则的精彩的执行摘要,有例子和常见的错误(基本上这里的其他答案是试图解释的,但不是同样的)。 |
最新内容
相关内容
python如何使用return语句
python如何使用return语句,地址,位置,情况,培训,函数,分析,控制权,地方,变量,语句,return语句就是讲结果返回到调用的地方,并把程序的控制权一python如何使用python发送邮件和接
python如何使用python发送邮件和接收邮件?,培训,状态,信息,代码,号码,工作,邮件,函数,尺寸,模块,发邮件是大家工作中最常用到的。今天来看一python如何使用python的help函数
python如何使用python的help函数,培训,函数,代码,基础知识,模块,参数,方法,用途,问题,括号,help函数是python的一个内置函数,在python基础知识python如何使用import
python如何使用import,培训,代码,模块,位置,标准,语句,函数,作用,方法,语法,python中的import语句是用来导入模块的,在python模块库中有着大量pythonpopitem如何使用
pythonpopitem如何使用,培训,字典,末尾,语法,实例,对象,形式,以上,参数,教程,python中popitem如何使用1、说明用于返回并删除字典中的一个键pythonisnumeric如何使用
pythonisnumeric如何使用,数字,培训,罗马数字,汉字,字符串,字节,实例,以上,教程,更多,python中isnumeric如何使用说明1、判断字符串是否只由python轮盘赌算法如何使用
python轮盘赌算法如何使用,个体,规模,培训,状态,种群,算法,概率,列表,个人,精髓,python轮盘赌算法如何使用说明1、轮盘赌算法的精髓是可以根pythonElasticsearch DSL如何使用
pythonElasticsearch DSL如何使用,位置,数据,培训,字段,空格,个数,根据,以上,条件,结果,pythonElasticsearchDSL如何使用1、连接Es:importelaspython负值如何使用?
python负值如何使用?,第一,培训,负值,倒数,元素,参数,下标,开头,剩余,例子,python负值如何使用?1、start与stop参数为负值start和stop的值可pythonmultiprocessing如何使用?
pythonmultiprocessing如何使用?,入口,代码,平台,培训,进程,函数,模块,操作系统,程序,实例,pythonmultiprocessing如何使用?1、说明Multiprocpythonpip如何使用
pythonpip如何使用,管理,系统,培训,版本,仓库,实例,以上,自然,教程,更多,python中pip如何使用1、说明Python中的第三方仓库通过pip的设置和管关于javascript:如何使用原型自动调
关于javascript:如何使用原型自动调整文本区域的大小?,关于javascript:如何使用原型自动调整文本区域的大小?,应用程序,用户,公司,地址,H