这篇算是解决以前留下的坑吧,这块之前看过不少东西,但是看过也只是看过没有正儿八经的研究过,最直接的就是上次去优信面试被问的贼尴尬。
先扔个问题:
第一个跟第二个的区别是什么?内存会发生什么变化?
实际测试结果,第一个跑完占用的内存是第二个的两倍。
那为什么呢?
答案在这里,加了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
那你就说你还有那些事情需要处理,处理好再过来报到,一般人事都会给几天时间的,但是,也不能拖太久了。还有,你要打听好这个公司薪资待遇,条件如何。有些职位好的,也会不断的筛选人才,要是你的拖延没有报到,人家招到更好的,就把你淘汰了。欢迎分享,转载请注明来源:夏雨云
评论列表(0条)