美文网首页objective-c原理
weak弱引用实现原理及面试相关问题

weak弱引用实现原理及面试相关问题

作者: 丶217 | 来源:发表于2018-01-06 12:37 被阅读0次

    想对读者说的话

    weak弱引用作为属性修饰符背后隐藏着十分深入的底层实现。纵观简书中weak弱引用相关的文章十分多,但是东一榔头西一棒槌,有讲weak浅层的特征的,有讲weak与assign区别的,有从他处搜罗出weak底层实现的,很杂乱,读者很难从中理清头绪。我希望通过近期这一系列文章,由浅入深的解答包括我在内所有读者探究的疑问,也会将面试遇到的问题在文章中作以解答。
    老生常谈,一个优秀面试官会通过一个问题逐层向下探究你对技术的深入了解,所以说思路要清晰,一方面理解一方面得能表达出来。我最近面试遇到一个很有趣的事儿分享给你们,随着看的东西越来越多,岁数越来越大,很难光凭背一个东西去记忆很长时间,于是我开始边理解边在纸上去划一些关键点,并且把这种方式带到了年初第一次面试中。人家说我问你几个问题,我说好,我拿出纸笔在纸上边写边理头绪,面完之后很意外的面试官把我这张纸要走了,或许是个加分项也说不定,个人感觉是个好方法,推荐给大家。
    那么废话说了这么多,进入正题吧...

    • 想彻底了解请通读文章
    • 想面试请快速阅读浅尝,渐入和总结三节

    浅尝 —— weak是什么?

    • weak是什么 —— 属性修饰符
      赋值属性修饰符包括 assignunsafe_unretainedretainstrongweakcopy 。如果不指定赋值修饰符,系统默认的修饰符是assign
      weak仅能在ARC下修饰属性,MRC下编译器会报错。
    • __weak是什么 —— 所有权修饰符
      当我们声明一个属性,编译器在为我们生成一个实例变量的同时,会使用所有权修饰符来修饰这个实例变量。根据属性修饰符的不同,用来修饰实例变量的所有权修饰符也不尽相同。
      __weak就是weak对应的所有权修饰符,编译器为weak修饰的属性生成带__weak所有权修饰符的实例变量。
    • __weak是如何起作用的
      我们来看一段代码:
      id __weak obj = [[NSObject alloc] init];
      我们都知道obj实际上是一个指针变量,该源代码将自己生成并持有的对象赋值给了附有__weak修饰符的指针变量obj,即指针变量obj持有对持有对象的弱引用,也就是说obj在__weak的修饰下成为了弱引用指针。指针变量obj不持有(弱引用)对象,引用计数器不+1,对象则会立即释放,编译器警告,运行后崩溃。

    渐入 —— 常见面试题weak和assign的区别

    • weak:
      1、对应__weak所属权修饰符
      2、不会让引用计数器+1
      3、如果指向对象被销毁,指针会自动清空(置nil)
    • assign:
      1、对应__unsafe_unretained所属权修饰符
      2、不会让引用计数器+1
      3、如果指向对象被销毁,指针不会清空,仍旧指向对象销毁后所处的内存区域,导致程序崩溃,野指针
    • 那么问题来了,为什么weak属性修饰符修饰后,指针变量会自动清空呢?请看下节,weak实现原理和底层解析。

    深入 —— weak实现原理和底层解析

    • 授人与渔
      讲底层实现之前有个东西要说,我看了很多底层实现解析的文章,里面讲的都很细致,逐步分析源码,还有流程,但唯独没告诉读者这源码从哪解析出来的,我自己想动手调试我该怎么办。接下来本文将先对这部分进行讲解。
    • 实际上苹果对于Runtime的源码是开源的,

    相关文章

      网友评论

        本文标题:weak弱引用实现原理及面试相关问题

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