美文网首页iOS开发-面试
iOS面试总结(2)

iOS面试总结(2)

作者: 朽木自雕也 | 来源:发表于2018-07-30 23:28 被阅读45次

    杭州的天气也是热得不要不要的。
    面试一周,跑遍了杭州城,四天前结束了这段漫漫面试路。
    本人动画专业出身,大学高数课都没有上过,底层原理都不会,工作之后去买书了解到的,看过的书籍有《计算机网络自顶向下方法》、《数据结构与算法》--c语言描述、《深入理解计算机系统》、《Objective-c基础程序设计》、《Objective-C高级编程之多线程与内存管理》、《iOS疯狂讲义 基础篇》、《iOS疯狂讲义 进阶篇》、《iOS开发进阶》、《iOS动画 核心技术与实战案例》、《JavaScript高级程序设计》、《图解CSS3 核心技术与实战案列》、《DOM编程艺术》、《Git学习指南》,这是工作这两年看的技术方面的书,有很多看过的现在已经忘得差不多了,不过个人还是有挺多收获。作为一个计算机外行人,两年工作经验,这次面试,找了一个18K的工作,而且收到了好几家公司的offer,有一点得意忘形了,sorry。不过有点可惜阿里三面挂了,今年不行,明年再来,反正还年轻✊, 哈哈哈!

    正题!
    weak 的实现原理?
    weak的基本概念
    weak是弱引用,用weak关键字修饰的变量所引用的对象引用计数不会加一,并且会在引用的对象释放后,变量自动赋值为nil。

    原理概述
    iOS系统中有一张hash(哈希)表专门用来记录weak修饰的指针,其中key是指针所指对象的内存地址,value是weak指针的地址数组(可能有点不懂,为什么是指针数组不是指针,从设计角度出发,一个对象可能会有多个弱引用)。Runtime 负责维护这个hash表(weak表)

    苹果实现步骤(大体概述,如果要仔细讲,三天三夜都讲不完,如果感兴趣可以私信探讨)
    1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向一个对象的地址。
    代码讲述
    id __weak o1= obj;
    当初始化一个weak变量是,runtime会调用NSObject.mm中的objc_initWeak函数。
    编译过后的代码如下:
    id o1;
    obj_initWeak(&o1, obj);//初始化__weak变量
    objc_destroyWeak(&o1);//释放_weak变量
    2、对象释放时,废弃谁也没有持有的对象的同时,程序的动作时怎么样的呢?解释如下:
    (1)objc
    release;
    (2) 因为引用计数为0调用dealloc
    (3)_objc_rootDealloc函数调用
    (4)调用object_dispose函数
    (5) objc_destructInstance 函数调用
    (6)objc_clear_deallocating函数调用
    在对象被废弃的同时最后调用的objc_clear-deallocating函数的动作如下:
    (1)从weak表中获取废弃对象的地址为键值的指针数组(对象weak引用列表)
    (2)将包含在数组中的所有指针赋值为nil
    (3)从weak表中删除这个键值对
    (4)从引用计数中删除废弃对象的地址为键值的记录
    参考资料:objective-c高级编程之多线程与内存管理

    相关文章

      网友评论

        本文标题:iOS面试总结(2)

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