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

『ios』-AutorealeasePool 解决上次面试留下的坑,第1张

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

先扔个问题:

第一个跟第二个的区别是什么?内存会发生什么变化?

实际测试结果,第一个跑完占用的内存是第二个的两倍。

那为什么呢?

答案在这里,加了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

那你就说你还有那些事情需要处理,处理好再过来报到,一般人事都会给几天时间的,但是,也不能拖太久了。还有,你要打听好这个公司薪资待遇,条件如何。有些职位好的,也会不断的筛选人才,要是你的拖延没有报到,人家招到更好的,就把你淘汰了。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/228669.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-09
下一篇2023-04-09

发表评论

登录后才能评论

评论列表(0条)

    保存