编程安全 内存管理 iphone内存管理编程指南.doc

编程安全 内存管理 iphone内存管理编程指南.doc

  1. 1、本文档共41页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编程安全 内存管理 iphone内存管理编程指南 导读:就爱阅读网友为您分享以下“iphone内存管理编程指南”的资讯,希望对您有所帮助,感谢您对92的支持! rstName, lastName] release]; return string; } 纯粹从内存管理的角度来讲,它看起来是正确的:您拥有alloc返回的字符串,并向它发送一条release的信息来释放所有权。然而从实用角度来看,该字符串很有可能在那一步就被回收了(它可能没有任何其他的所有者),因此该方法的调用者会接收到一个无效的对象。这说明了为什么autorelease非常实用—它能让您推迟释放,您可以在未来的某一时刻过后再释放对象。为了追求完整性,下面的代码也是错误的 :- (NSString *)fullName { NSString *string = [[NSString alloc] initWithFormat:@quot;%@ %@quot;, firstName, lastName]; return string; } 您拥有alloc返回的字符串,但是在您有机会释放所有权之前,您就失去了对该对象的引用。根据内存管理规则,这将导致内存泄漏,因为调用者没有得到任何迹象表明他们拥有返回的对象。//////////////////////////////////////////////////自动释放池本章向您介绍如何微调您的应用程序对自动释放池的控制;有关使用自动释放机制的一般介绍请参考文档“对象的所有权和销毁”。自动释放池概述自动释放池是一个NSAutoreleasePool实例,其中“包含”已经收到autorelease消息的其他对象;当自动释放池被回收时,它会向其中的每个对象发送一条release消息。一个对象可以被数次放入一个自动释放池中,并且在每次被放入池中的时候都会收到一条release消息。因此,向对象发送autorelease消息(而不是release消息)可以至少将该对象的生命周期延长至自动释放池本身被释放的时候(如果在此期间对象被保留,则它可以存活更久)。Cocoa总是期望有一个自动释放池可用。如果自动释放池不可用,那么自动释放对象就无法得到释放,您也就泄漏了内存。如果当自动释放池不可用的时候,您发送了autorelease消息,那么Cocoa会记录相应的错误信息。您可以使用常见的alloc和init消息来创建一个NSAutoreleasePool对象,并使用drain(如果您向一个自动释放池发送autorelease或retain消息,会引发异常—要了解release和drain之间的差异,请参考“垃圾回收”)销毁它。自动释放池应该总是在与它被创建时所处的相同上下文环境(方法或函数的调用,或循环体)中被销毁。自动释放池被置于一个堆栈中,虽然它们通常被称为被“嵌套”的。当您创建一个新的自动释放池时,它被添加到堆栈的顶部。当自动释放池被回收时,它们从堆栈中被删除。当一个对象收到送autorelease消息时,它被添加到当前线程的目前处于栈顶的自动释放池中。嵌套自动释放池的能力是指,您可以将它们包含进任何函数或方法中。例如,mai ain函数可以创建一个自动释放池,并调用另一个创建了另外一个自动释放池的函数。或者,一个方法可以有一个自动释放池用于外循环,而有另一个自动释放池用于内循环。嵌套自动释放池的能力是一种很显著的优势,但是,当发生异常时也会有副作用(见“自动释放池的作用域和嵌套自动释放池的含义”)。Application Kit会在一个事件周期(或事件循环迭代)的开端—比如鼠标按下事件—自动创建一个自动释放池,并且在事件周期的结尾释放它,因此您的代码通常不必关心。但是,有三种情况您应该使用您自己的自动释放池:如果您正在编写一个不是基于Application Kit的程序,比如命令行工具,则没有对自动释放池的内置支持;您必须自己创建它们。如果您生成了一个从属线程,则一旦该线程开始执行,您必须立即创建您自己的自动释放池;否则,您将会泄漏对象。(详情请参考“自动释放池和线程”。)如果您编写了一个循环,其中创建了许多临时对象,您可以在循环内部创建一个自动释放池,以便在下次迭代之前销毁这些对象。这可以帮助减少应用程序的最大内存占用量。自动释放池是“按序”使用的。一般情况下,您不应该将自动释放池作为某个对象的实例变量。非 Application Kit 程序中的自动释放池在不是基于Applic

文档评论(0)

raojun00006 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档