iOS面试总结(2)
杭州的天气也是热得不要不要的。
面试一周,跑遍了杭州城,四天前结束了这段漫漫面试路。
本人动画专业出身,大学高数课都没有上过,底层原理都不会,工作之后去买书了解到的,看过的书籍有《计算机网络自顶向下方法》、《数据结构与算法》--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高级编程之多线程与内存管理