Skip to main content
  1. Objective-C/

AutoreleasePool

·1 分钟
OC AutoreleasePool
Objc - 系列文章之一
Part 20: 当前阅读
自动释放池的主要底层数据结构是:__AtAutoreleasePool、AutoreleasePoolPage;调用了autorelease的对象最终都是通过AutoreleasePoolPage对象来管理的
AutoreleasePoolPage内部结构>

AutoreleasePoolPage内部结构 #

  • 每个 AutoreleasePoolPage 对象占用 4096 字节内存,除了用来存放它内部的成员变量,剩下的空间用来存放 autorelease 对象的地址
  • 所有的 AutoreleasePoolPage 对象通过双向链表的形式连接在一起

1

@autoreleasepool作用原理>

@autoreleasepool作用原理 #

@autoreleasepool {
        NSObject *obj = [[[NSObject alloc] init] autorelease];
    }

// 以上代码可以被解释为
{
		// atautoreleasepoolobj = 0x1038
		atautoreleasepoolobj = objc_autoreleasePoolPush();
    NSObject *obj = [[[NSObject alloc] init] autorelease];
		objc_autoreleasePoolPop(0x1038);
}

在大括号开始时将autorelease对象地址pushAutoreleasePoolPage,在大括号结束时pop出来。

说明>

说明 #

  • 调用push方法会将一个POOL_BOUNDARY入栈,并且返回其存放的内存地址。
  • 调用pop方法时传入一个POOL_BOUNDARY的内存地址,会从最后一个入栈的对象开始发送release消息,直到遇到这个POOL_BOUNDARY

id *next指向了下一个能存放autorelease对象地址的区域



Objc - 系列文章之一
Part 20: 当前阅读