美文网首页
内存面试题

内存面试题

作者: Foxhoundsun | 来源:发表于2020-05-10 02:11 被阅读0次

    一、临时变量什么时候释放?

    答:
    ARC环境,大括号结束时释放。
    MRC环境,在主线程中,临时变量会在runloop运行结束时释放。在非主线程中,临时变量会在线程退出时释放。

    二、自动释放池原理

    答:

    • Autorelease pool自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来统一回收释放。自动释放池本身销毁的时候,池子里面所有的对象都会做一次release操作。

    • 任何OC对象只要调用autorelease方法,就会把该对象放到离自己最近的自动释放池中(栈顶的释放池)。

    • NSAutoreleasePool就是用来做引用计数的管理工作的。autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一。

    • 自动释放池的主要底层数据结构是:__AtAutoreleasePool 析构函数和 AutoreleasePoolPage链表。调用了autorelease的对象最终由AutoreleasePoolPage对象来管理

    • 每一个AutoreleasePoolPage对象占用4094字节内存,本身成员占用56字节,剩下的空间用来存放autorelease对象的地址。所有的AutoreleasePoolPage对象通过双向链表的形式连接在一起。

    • 每执行@autoreleasepool底层对应执行objc_autoreleasePoolPush(); 就会往AutoreleasePoolPage添加 POOL_BOUNDARY,并返回POOL_BOUNDARY所在AutoreleasePoolPage的内存空间地址。

    • @autoreleasepool{}大括号结束 内部创建的__AtAutoreleasePool对象销毁,调用析构函数objc_autoreleasePoolPop(atautoreleasepoolobj)

    • AutoreleasePoolPage开始从后往前遍历autorelease对象调用release方法直到objc_autoreleasePoolPop()传入的POOL_BOUNDARY地址为止

    三、自动释放池能否嵌套使用?

    答:

    • MRC下,自动释放池中的对象何时释放主要取决于对象何时进行 autorelease 操作,也就是说具体看[对象 autorelease]
    • 对象的释放时间,看各自所在的@autorelease{ }的右半大括号在什么位置,当代码执行到那个位置,该对象就自动释放.

    相关文章

      网友评论

          本文标题:内存面试题

          本文链接:https://www.haomeiwen.com/subject/ykklnhtx.html