美文网首页
iOS weak关键字

iOS weak关键字

作者: 小手冰凉_39fc | 来源:发表于2018-04-11 15:31 被阅读0次

        作为一个面试经常被问到的问题,iOS weak关键字

基本概念

        在iOS中,weak的常用来处理NSTimer,delegate,block的循环引用问题。它是一个弱引用,在对象释放之后,weak指针自动指向nil,避免野指针,避免错误的内存访问。

如何在对象释放的时候指针置为nil

        还记得,第一次,接触到这个问题,只知道weak是弱引用,对象释放以后,指针会自动赋值为nil。但是为什么在对象释放后,指针就成了nil,中间进行了什么样的操作。

        weak说的简单一些,其实就相当于一个哈希表,在runtime中,是一个觉weak表的东西。将所指对象的地址作为key,vaule是所有指针地址的一个数组,因为一个对象,可以有多个weak指针指向它。

        在对象释放的时候,会调用一个函数,我们可以看到关键的一些代码

for(size_t i = 0; i < count; ++i) {

        objc_object **referrer = referrers[i];

        if(referrer) {

            if(*referrer == referent) {

                *referrer = nil;

            }

            elseif(*referrer) {

                _objc_inform("__weak variable at %p holds %p instead of %p. "

                             "This is probably incorrect use of "

                             "objc_storeWeak() and objc_loadWeak(). "

                             "Break on objc_weak_error to debug.\n",

                             referrer, (void*)*referrer, (void*)referent);

                objc_weak_error();

            }

        }

    }

    weak_entry_remove(weak_table, entry);

这里只截取了少量的代码,可以看到,在对象释放的时候,会通过key找到weak表中的vaule,从这个数组中,依次把指针设为nil,最后,把weak表相关的记录也全部删除。

weak 表实现原理

weak 的实现原理可以概括一下三步:

1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。

2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak() 的作用是更新指针指向,创建对应的弱引用表。

3、释放时,调用clearDeallocating函数。clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。

相关文章

  • iOS开发之有用的文章

    1、iOS weak 关键字漫谈 : http://mrpeak.cn/blog/ios-weak/ 2、加载gi...

  • iOS 中weak的实现

    只要学过 iOS 的人,都会对 strong、weak、copy等关键字应该都会很熟悉。weak 属性关键字就是弱...

  • iOS属性关键字

    iOS属性关键字 引言 学习 iOS 开发的人,大多都绕不开属性关键字—— assign,weak,unsafe_...

  • iOS 深拷贝浅拷贝与@property 引用计数关键字Stro

    iOS 深拷贝浅拷贝与@property 引用计数关键字Strong,Copy,Weak,Assign iOS 深...

  • iOS weak关键字

    作为一个面试经常被问到的问题,iOS weak关键字 基本概念 在iOS中,weak的常用来处理NSTimer,d...

  • iOS weak 关键字漫谈

    weak 关键字的运用在 iOS 当中属于基础知识,在面试的时候问 weak 的用处,就像两个 iOS 程序员见面...

  • iOS 内存管理(3)-属性词基本讲解

    引言 学习 iOS 开发的人,大多都绕不开属性关键字—— assign,weak,unsafe_unretaine...

  • iOS内存管理之__weak

    iOS开发中经常会用到__weak关键字,那__weak的功能是什么估计大家都知道,但是苹果是怎么实现的估计不是都...

  • IOS属性关键字笔记

    关于IOS属性关键字的一些理解和笔记,对于weak,strong,assign,nonatomic,natomic...

  • ----

    第一部分 iOS基础 1、 常用关键字,retain,copy,mutablecopy,weak,assign,...

网友评论

      本文标题:iOS weak关键字

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