『ios』-AutorealeasePool 解决上次面试留下的坑

 我来答
黑科技1718
2022-06-05 · TA获得超过5900个赞
知道小有建树答主
回答量:433
采纳率:97%
帮助的人:82.8万
展开全部

这篇算是解决以前留下的坑吧,这块之前看过不少东西,但是看过也只是看过没有正儿八经的研究过,最直接的就是上次去优信面试被问的贼尴尬。
先扔个问题:

第一个跟第二个的区别是什么?内存会发生什么变化?
实际测试结果,第一个跑完占用的内存是第二个的两倍。
那为什么呢?
答案在这里,加了autoreleasepool后,每当一个循环跑完,里面的临时变量image就会被释放掉,所以跑完内存会小很多。
剩下的就剩下刨根问底了,走起吧!

这就是autoreleasepool函数原来的面目,两部,push 和 release操作。
然后我注意到了这个 AutoreleasePoolPage ,那么这个的构成是什么呢?

每个自动释放池都由好多个autoreleasepoolpage组成的

说了这么多还是看下push和 pop是怎么实现的吧。

上面的add过程说白了就是 压栈 的过程。每当对象调用autorelease方法的时候,都会将对象加入到* AutoreleasePoolPage*栈中。
调用 AutoreleasePoolPage::pop 方法会向栈中的对象发送 release 消息

我最开始的理解也是在括号结束之后才会去释放,但是忘了一点,runloop,
系统在每个runloop中都会加入 push 和 pop的监听,。所以肯定是在runloop结束的时候。

通过查阅资料看到下面这句话

所以 _objc_autoreleasePoolPush 和 _objc_autoreleasePoolPop 的优先级肯定是最高的,以保证能正确的push和pop

看完上面不知道能理解多少,对于博客还是写的有点乱。
看看下面这个问题

看上面 1 2 都是临时变量,所以在一次循环之后就会被释放掉。
这是我刚开始的理解(而strTest 的作用域是viewdidload,所以每次循环,strTest的指针都指向了一个新的对象,但是原来的对象没有被释放掉,所以内存就会一直增加。)感觉有不对的地方。
然后我看到这句话

也就是说 [NSString stringWithFormat:@"%@%@", num, str] 不会自动加入到自动释放池中,这时候就体现了我们自己加的这个autoreleasepool的作用了,强行给他加了一个作用域,所以每当一个autoreleasepool结束的时候, [NSString stringWithFormat:@"%@%@", num, str] 就会被释放掉。

借鉴地址AutorealeasePool
借鉴地址 runloop

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
面试通
2024-11-19 广告
快速面试助手是武汉智联世界科技有限公司开发的高效面试工具。它利用人工智能技术,帮助HR和企业快速筛选简历,智能匹配岗位需求,实现初步面试自动化。通过预设问题库和自动评分系统,快速面试助手能大幅提升面试效率,减轻HR负担。同时,它还能提供面试... 点击进入详情页
本回答由面试通提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式