1 / 53
文档名称:

ObjectiveC程序设计内存管理.pptx

格式:pptx   大小:449KB   页数:53页
下载后只包含 1 个 PPTX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

ObjectiveC程序设计内存管理.pptx

上传人:wz_198613 2021/2/27 文件大小:449 KB

下载得到文件列表

ObjectiveC程序设计内存管理.pptx

文档介绍

文档介绍:目录





自动释放池
在处理Foundation程序时,为了使用Foundation对象,必须设置自己的池。系统使用这个池来跟踪对象,以便以后释放。在应用程序中,可以通过调用来建立这个池,如下所示:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
自动释放池
建立了自动释放池之后,Foundation将自动为这个池添加特定的数组、字符串、宇典以及其他对象。使用完该池时,可以发送drain消息来释放它使用的内存:
[pool drain];
任何标记为自动释放并因此添加到池中的对象,将在池本身被释放的同时也自动释放,自动释放池的名称就是由此而来的。事实上,程序中可以有多个自动释放池,并且它们还可以是嵌套的。
自动释放池
如果你的程序产生了大量的临时对象,可能需要在程序中创建多重自动释放池。例如代码片段:
NSAutoreleasePool *tempPool;
...
for (i = 0; i < n; ++i) {
tempPool = [[NSAutoReleasePool alloc] init];
... // lots of work with temporary objects here
[tempPool drain];
}
说明了如何创建几个自动释放池来释放由for循环的每一次迭代而产生的临时对象。应该注意到自动释放池并不包括实际对象本身,仅仅是对释放池要释放的对象的引用。
自动释放池
通过想当前的自动释放池发送一条autorelease消息,可以将一个对象添加到其中,以便以后释放。
[myFraction autorelease];
然后,系统将myFraction添加到自动释放池中以便将来自动释放。
引用计数
Foundation框架提供了一个巧妙的解决方案,用于跟踪对象的引用次数。它涉及一个相当简单直观的技术,称为引用计数。其概念如下:创建对象时,将它的引用次数设置为1,每一次必须保持该对象时,就发送一条retain消息,使其引用次数加1,如下所示:
[myFraction retain];
Foundation框架提供的其他一些方法也可以增加对象的引用次数,例如,把对象添加到数 组中时。不再需要对象时,可以通过发送release消息,使对象的引用次数减1,如下所示:
[myFraction release];
通过向对象发送retainCount消息,可以获得该对象的引用计数,注意,它将返回一个NSUinteger类型的无符号整数。
Program
// Introduction to reference counting
#import <Foundation/>
#import <Foundation/>
#import <Foundation/>
#import <Foundation/>
#import <Foundation/>
int main (int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSNumber *myInt = [NSNumber numberWithInteger: 100];
NSNumber *myInt2;
NSMutableArray *myArr = [NSMutableArray array];
NSLog (@”myInt retain count = %lx”,
(unsigned long) [myInt retainCount]);
[myArr addObject: myInt];
NSLog (@”after adding to array = %lx”,
(unsigned long) [myInt retainCount]);
myInt2 = myInt;
NSLog (@”after asssignment to myInt2 = %lx”,
(unsigned long) [myInt retainCount]);
引用计数
[myInt retain];
NSLog (@”myInt after retain = %lx”,
(unsigned long) [myInt retai