欢迎来到天天文库
浏览记录
ID:32699496
大小:62.10 KB
页数:7页
时间:2019-02-14
《编程安全内存管理iphone内存管理编程指南》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、编程安全内存管理iphone内存管理编程指南导读:就爱阅读网友为您分享以下“iphone内存管理编程指南”的资讯,希望对您有所帮助,感谢您对92to.com的支持!rstName,lastName]release];returnstring;}纯粹从内存管理的角度来讲,它看起来是正确的:您拥有alloc返回的字符串,并向它发送一条release的信息来释放所有权。然而从实用角度来看,该字符串很有可能在那一步就被回收了(它可能没有任何其他的所有者),因此该方法的调用者会接收到一个无效的对象。这说明了为什
2、么autorelease非常实用一它能让您推迟释放,您可以在未来的某一时刻过后再释放对象。为了追求完整性,下面的代码也是错误的:-(NSString*)fullName{NSString^string=[[NSStringalloc]initWithFormat:@"%@%@"firstName,lastName];returnstring;}您拥有alloc返回的字符串,但是在您有机会释放所有权之前,您就失去了对该对象的引用。根据内存管理规则,这将导致内存泄漏,因为调用者没有得到任
3、何迹象表明他们拥有返回的对象。//////////////////////////////////////////////////自动释放池本章向您介绍如何微调您的应用程序对自动释放池的控制;有关使用自动释放机制的一般介绍请参考文档“对象的所有权和销毁”。自动释放池概述自动释放池是一个NSAutoreleasePool实例,其中“包含”已经收到autorelease消息的其他对象;当自动释放池被回收时,它会向其中的每个对象发送一条release消息。一个对象可以被数次放入一个自动释放池中,并且在每次被
4、放入池中的时候都会收到一条release消息。因此,向对象发送autorelease消息(而不是release消息)可以至少将该对象的生命周期延长至自动释放池本身被释放的时候(如果在此期间对象被保留,则它可以存活更久)。Cocoa总是期望有一个自动释放池可用。如果自动释放池不可用,那么自动释放对象就无法得到释放,您也就泄漏了内存。如果当自动释放池不可用的时候,您发送了autorelease消息,那么Cocoa会记录相应的错误信息。您可以使用常见的alloc和init消息来创建一个NSAutorelea
5、sePool对象,并使用drain(如果您向一个自动释放池发送autorelease或retain消息,会引发异常一要了解release和drain之间的差异,请参考“垃圾回收”)销毁它。自动释放池应该总是在与它被创建时所处的相同上下文环境(方法或函数的调用,或循环体)中被销毁。自动释放池被置于一个堆栈中,虽然它们通常被称为被“嵌套,啲。当您创建一个新的自动释放池时,它被添加到堆栈的顶部。当自动释放池被回收时,它们从堆栈中被删除。当一个对象收到送autorelease消息时、它被添加到当前线程的目前处
6、于栈顶的自动释放池中。嵌套自动释放池的能力是指,您可以将它们包含进任何函数或方法中。例如,maiain函数可以创建一个自动释放池,并调用另一个创建了另外一个自动释放池的函数。或者,一个方法可以有一个自动释放池用于外循环,而有另一个自动释放池用于内循环。嵌套自动释放池的能力是一种很显著的优势,但是,当发生异常时也会有副作用(见“自动释放池的作用域和嵌套自动释放池的含义”)。ApplicationKit会在一个事件周期(或事件循环迭代)的开端一比如鼠标按下事件一自动创建一个自动释放池,并且在事件周期的结尾
7、释放它,不必关心。但是,有三种情况您应该使用您自己的自动释放池:如果您正在编写一个不是基于ApplicationKit的程序,比如命令行工具,则没有对自动释放池的内置支持;您必须自己创建它们。如果您生成了一个从属线程,则一旦该线程开始执行,您必须立即创建您自己的自动释放池;否则,您将会泄漏对象。(详情请参考“自动释放池和线程”。)如果您编写了一个循环,其中创建了许多临时对象,您可以在循环内部创建一个自动释放池,以便在下次迭代之前销毁这些对象。这可以帮助减少应用程序的最大内存占用量。自动释放池是“按序”
8、使用的。一般情况下,您不应该将自动释放池作为某个对象的实例变量。非ApplicationKit程序中的自动释放池在不是基于ApplicationKit的程序中,启用自动释放机制是很容易的。您可以简单地在main()函数的开始创建一个自动释放池,并在main()函数的最后释放它一这是Xcode中的FoundationTool模板使用的模式。这样就为任务的生命周期建立了一个自动释放池。但是,这也意味着在任务的生命周期中创建的所有的自动释放对象,都要等到任务完
此文档下载收益归作者所有