- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
教程详细:
????? 技术:Objective-C??? 难度:初学者?? ? 完成时间:20-30分钟
? 欢迎来到学习Objective-C系列教程的第五部分,今天我们要看看内存管理,这是特意为新手准备的一个Objective-C的章节哟。大部分脚本语言(如PHP)则采取内存自动管理,但Objective-C需要我们慎用内存,需要我们手动创建和释放对象。
?? 这是挺好的做法,这让我们控制多少内存被应用程序使用,这样,你就不会遇到系统内存的泄漏了。更重要的是,移动系统,例如iPhone的内存比台式机器更有限。
两种方式
????? 在Objective-C中有两种内存管理方式,第一种是引用计数,第二种是垃圾回收。你可以认为是手动和自动两种,因为计数引用是用程序代码实现的,垃圾回收是系统自动管理内存的。有一点要注意的是iPhone没有垃圾回收功能,这就是为什么我们不深究其工作的原因。如果你的程序是运行Mac上,你可以在苹果的文档上获释垃圾回收的工作原理。
引用计数
? 嗯~,我们该如何管理内存呢?首先,什么时候在我们的代码里使用到内存?当你创建一个类的实例时,内存就被申请了并且我们能使用它。现在,一个小小的对象也许还不能体现大大的关注,但当你的应用程序规模大起来时,它马上要引起注意的了。
? 让我们先看看一个例子吧,我们有一些绘画的应用程序,每个图形的形状是单独的对象。如果用户画了100个形状,这样在内存里就有一百个对象了。现在,我们的用户重新开始并清除屏幕后,接着画另外100个对象。如果我们没有管理好我们的内存,我们将有200个对象占着内存而不做任何事情。
? 我们用引用计数来进行计算。当我们创建一新对象并申请内存,我们的对象就保留1个计数。如果我们要求保留这对象,则计数器就变为2。如果我们释放这个对象,这计数器就变回1。但当计数器变为0时,系统就会回收这对象,释放内存。
语法
? 有几种可影响我们的内存的方法可供调用。首先,当我们用一名字包含alloc,新建,复制等方法来创建一对象时,如果你使用对象来保存方法,这也是真实的。当你手动释放或自动释放一对象时,你不再需要关心对象的所有权发生如何变化了。
? 所以,如果我们为一对象申请内存:
1: myCarClass *car = [myCarClass alloc];
??? 现在我们要对汽车对象负责,并且必须手动释放它(或自动释放)。这点很重要,如果你尝试手动释放一个被设置为自动释放的对象时,应用程序可能会崩溃的哟。
? 既然我们用alloc创建了一对象,我们的car对象现在保存计数为1,这意味着它不会被释放。如果也是我们保存的对象,这样:
1: [car retain];
? 现在我们的内存计数为2。然而为了释放对象,我们需要释放两次来设置计数为0。由于现在的计数为0,这对象就会被清理了。
自动释放和自动释放池(Autorelease and Autorelease Pool’s)
??? 当你已经新建一个Xcode项目,你可能也注意到一些默认产生的关于自动释放池的代码,可能你现在已经忽略它了,那让我们来看看它做什么和在哪里使用它吧。
? 你的代码可能看起来和这些相似吧:
1: NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
2: [pool drain];
? 注意:如果你指的是旧文档,你可能会看到最后一行作为释放,这是语言的新特性,但基本上做同样的事情。
? 现在,你应该能知道上面的代码是做什么的了吧,它是创建一个叫pool的NSAutoReleasePool实例,为它分配内存并用init方法来初使化。
? 当我们发送autorelease消息给对象时,该对象被添加到内部最深处的自动释放池(内部最深,因为池是可以相互嵌套的,后面会更多谈到)。当池接收到销毁消息,那么所有的接收到自动释放的对象会被释放掉,基于延迟自动释放会在后面介绍。
? 这是有用的,因为很多方法会返回一个对象,通常返回一个自动释放对象,这意味着我们不用关心对象计数,我们只管使用,不用管释放的问题了,因为它自己完成的。
嵌套的自动释放池
? 之前我提及过嵌套自动释放池,但我们用这干什么呢?虽然有几种用法,其中一最普通的用法是,在一个使用临时对象的循环里使用嵌套的自动释放池。
? 例如,你有一用来创建两个临时对象的循环,如果你设置这两个对象为自动释放,你可以使用它们直到循环发送销毁消息,并且不用关心手动释放内存分配。苹果公司有一个很好的例子,当你在文档里使用嵌套的自动释放池就会发现:
1: void main()
2: {
3: NSAu
您可能关注的文档
最近下载
- 2024年GD省生态环境监测专业技术人员大比武模拟试卷及答案-3应急监测.pdf
- 2024至2030年中国抬头显示器(HUD)行业市场深度研究及发展趋势预测报告.docx
- 第四章 刺胞动物门之二PPT课件.pptx
- 性治疗学 -学校选修.ppt
- 【B-1】本机构为护士实施治疗及护理时提供必要的防护措施,护士熟练掌握常见技术操作及并发症预防措施及处理流程。.docx
- 必威体育精装版《简爱》课件PPT完整版.ppt
- 管理者领导能力的提升.ppt
- 不锈钢安装技术交底.docx
- 部编版八年级历史上册《第7课 抗击八国联军》说课课件.pptx
- 2021(春节国潮市集)文旅新春国潮文化嘉年华魅力盛世国潮活动.doc
文档评论(0)