美文网首页iOS面试
iOS 内存管理面试题(MRC(手动引用计数)和ARC(自动引用

iOS 内存管理面试题(MRC(手动引用计数)和ARC(自动引用

作者: 程序员_秃头怪 | 来源:发表于2019-08-07 16:30 被阅读21次
MRC(手动引用计数)和ARC(自动引用计数)

1、MRC:alloc,retain,release,retainCount,autorelease,dealloc
2、ARC:

  • ARC是LLVM和Runtime协作的结果
  • ARC禁止手动调用retain,release,retainCount,autorelease关键字
  • ARC新增weak,strong关键字

3、引用计数管理:

  • alloc: 经过一系列函数调用,最终调用了calloc函数,这里并没有设置引用计数为1
  • retain: 经过两次哈希查找,找到其对应引用计数值,然后将引用计数加1(实际是加偏移量)
  • release:和retain相反,经过两次哈希查找,找到其对应引用计数值,然后将引用计数减1
  • dealloc:

4、弱引用管理:

  • 添加weak变量:通过哈希算法位置查找添加。如果查找对应位置中已经有了当前对象所对应的弱引用数组,就把新的弱引用变量添加到数组当中;如果没有,就创建一个弱引用数组,并将该弱引用变量添加到该数组中。

  • 当一个被weak修饰的对象被释放后,weak对象怎么处理的?
    清除weak变量,同时设置指向为nil。当对象被dealloc释放后,在dealloc的内部实现中,会调用弱引用清除的相关函数,会根据当前对象指针查找弱引用表,找到当前对象所对应的弱引用数组,将数组中的所有弱引用指针都置为nil。

5、自动释放池:

在当次runloop将要结束的时候调用objc_autoreleasePoolPop,并push进来一个新的AutoreleasePool

AutoreleasePoolPage是以栈为结点通过双向链表的形式组合而成,是和线程一一对应的。
内部属性有parent,child对应前后两个结点,thread对应线程 ,next指针指向栈中下一个可填充的位置。

  • AutoreleasePool实现原理?

编译器会将 @autoreleasepool {} 改写为:

void * ctx = objc_autoreleasePoolPush;
    {}
objc_autoreleasePoolPop(ctx);
  • objc_autoreleasePoolPush:
    把当前next位置置为nil,即哨兵对象,然后next指针指向下一个可入栈位置,
    AutoreleasePool的多层嵌套,即每次objc_autoreleasePoolPush,实际上是不断地向栈中插入哨兵对象。

  • objc_autoreleasePoolPop:
    根据传入的哨兵对象找到对应位置。
    给上次push操作之后添加的对象依次发送release消息。
    回退next指针到正确的位置。

热文推荐

2019 全网 iOS 面试题以及答案总结!

相关文章

网友评论

    本文标题:iOS 内存管理面试题(MRC(手动引用计数)和ARC(自动引用

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