前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS-内存管理(二)

iOS-内存管理(二)

原创
作者头像
Wilbur-L
修改2020-12-25 14:54:43
6130
修改2020-12-25 14:54:43
举报
文章被收录于专栏:iOS底层原理

一·自动释放池(Autoreleasepool)

struct AutoreleasePoolPageData

{

magic_t const magic;

__unsafe_unretained id *next;

pthread_t const thread;

AutoreleasePoolPage *const parent;

AutoreleasePoolPage *child;

depth;

hiwat;

AutoreleasePoolPageData(_next,_thread,AutoreleasePoolPage *_parent,_depth,_hiwat)

:magic(),next(_next),thread(_thread),parent(_parent),child(nil),depth(_depth),hiwat(_hiwat)

}

结构解释:

magic:用来校验AutoreleasePoolPage结构是否完整 //4*4 16字节

next:指向下一个Autorelease对象,初始化时指向begin //8字节

thread:指向当前线程 //8字节

parent:父节点 //8字节

child:子节点 //8字节

depth:深度 //4字节

hiwat:代表high water mark 最大入栈数量标记 //4字节

AutoreleasePoolPage 构造函数-初始化自动释放池

二·自动释放池的压栈

研究自动释放池,主要是搞清楚释放池和对象的关系

在自动释放池的7791源码有如下注释

A thread`s autorelease pool is a stack of pointers.Each pointer is either an object to release,or POOL_BOUNDARY which

is an autorelease pool boundary.

第一步,搞清楚对象的压栈到哪

1.begin

begin()

{

return (id *) ((uint8_t *)this+sizeof(*this));

}

压到 (对象地址+自动释放池大小56 )位处

2.end

id *end()

{

return (id *)((uint8_t *)this+SIZE);

}

3.empty

return next==begin();

4.full

return next==end();

5.lessThanHalfFull

return (next-begin()<(end()-begin()) / 2);

第二步,压了什么东西

自动释放池的第一页第一个压了一个边界,其余压对象

自动释放池-双向链表结构
自动释放池-双向链表结构

三·自动释放池出栈

pop()

{

stop = (id *)token;

return popPage(token,page,stop);

}

如何释放

调整双向链表的指针来释放

popPage()

{

obj = *--page->next;

objc_release(obj);

}

释放完调整指针kill()

page=page->parent;

page->child=nil;

析构当前线程

tls_dealloc(void *p)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一·自动释放池(Autoreleasepool)
  • 二·自动释放池的压栈
  • 三·自动释放池出栈
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档