xml地图|网站地图|网站标签 [设为首页] [加入收藏]

腾讯一面,包含weak对象的初始化

来源:http://www.ccidsi.com 作者:集成经验 人气:100 发布时间:2020-02-14
摘要:很罕有人明白weak表其实是一个hash表,Key是所指对象的地址,Value是weak指针的地点数组。更三人的人只是精通weak是弱引用,所引用对象的计数器不会加一,并在援用对象被放飞的时候自

很罕有人明白weak表其实是一个hash表,Key是所指对象的地址,Value是weak指针的地点数组。更三人的人只是精通weak是弱引用,所引用对象的计数器不会加一,并在援用对象被放飞的时候自动被安装为nil。常常用于减轻循环援引难点。但方今单知道这个早就不足以应对面试了,非常多商家会问weak的规律。weak的规律是怎么吗?上面就深入分析一下weak的干活原理(只是自个儿对这些主题素材奇异,学习进程中的笔记,希望对读者也颇负帮助)。

先上贰个前方的映衬:

回答是:

Runtime维护了二个weak表,用于存款和储蓄指向有些对象的有所weak指针。weak表其实是二个hash表,Key是所指对象的地点,Value是weak指针的地址(那些地址的值是所指对象的地点)数组。

1、初步化时:runtime会调用objc_initWeak函数,初叶化三个新的weak指针指向对象之处。

2、增添援引时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak(卡塔尔(قطر‎ 的功能是改革指针指向,创制对应的弱引用表。

3、释放时,调用clearDeallocating函数。clearDeallocating函数首先依据目的地址获取具备weak指针地址的数组,然后遍历这一个数组把此中的多寡设为nil,最后把那一个entry从weak表中删除,最终清理对象的记录。

1.落成weak后,为啥对象释放后会自动为nil

runtime对登记的类, 会进行结构,对于weak对象会放入一个hash表中。 用weak指向的对象内部存款和储蓄器地址作为key,当此对象的引用计数为0的时候会dealloc,若是weak指向的靶子内部存款和储蓄器地址是a,那么就能以a为键, 在此个weak表中搜索,找到全部以a为键的weak对象,进而设置为nil。

2.当weak引用指向的指标被放走时,又是什么去管理weak指针的啊

1、调用objc_release

2、因为对象的援引计数为0,所以进行dealloc

3、在dealloc中,调用了_objc_rootDealloc函数

4、在_objc_rootDealloc中,调用了object_dispose函数

5、调用objc_destructInstance

6、最终调用objc_clear_deallocating,详细进度如下:

a. 从weak表中拿到放弃对象的地点为键值的记录

b. 将满含在笔录中的全体附有 weak修饰符变量的地址,赋值为 nil

c. 将weak表中该记录删除

d. 从引用计数表中去除放弃对象的地点为键值的笔录

Runtime维护了一个weak表,用于存储指向某些对象的享有weak指针。weak表其实是叁个hash表,Key是所指对象的地点,Value是weak指针的地址(那么些地址的值是所指对象指针的地点)数组。

我有一个分享面试体会沟通的扣扣群,里面有小编前段时间面试种种公司的面试题,有意思味能够加我的群哦

图片 1图片 2

下一场继续就来了

追问的主题材料风华正茂:完毕weak后,为啥对象释放后会自动为nil?

追问的难点二:当weak引述指向的靶子被放出时,又是何等去处理weak指针的吗?

自家作者计算的答案:

追问难题意气风发的答案:

runtime?对注册的类, 会进行布局,对于?weak?对象会放入三个?hash?表中。 用?weak?指向的对象内部存储器地址作为?key,当此对象的援引计数为?0?的时候会?dealloc,借使?weak?指向的靶子内部存款和储蓄器地址是?a?,那么就能够以?a?为键, 在此个?weak?表中搜索,找到全数以?a?为键的?weak?对象,进而设置为?nil?。

追问难点二的答案:

2.当weak援引指向的靶子被保释时,又是如何去管理weak指针的呢?

1、调用objc_release

2、因为对象的援用计数为0,所以进行dealloc

3、在dealloc中,调用了_objc_rootDealloc函数

4、在_objc_rootDealloc中,调用了object_dispose函数

5、调用objc_destructInstance

6、最终调用objc_clear_deallocating,详细进程如下:

a. 从weak表中收获扬弃对象之处为键值的记录

b. 将含有在笔录中的全体附有 weak修饰符变量的地点,赋值为 nil

c. 将weak表中该记录删除

d. 从援用计数表中删去扬弃对象的地点为键值的笔录

1、开始化时:runtime会调用objc_initWeak函数,初叶化二个新的weak指针指向对象之处。2、加多引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak(卡塔尔(قطر‎的效应是立异指针指向,创造对应的弱援用表。3、释放时,调用clearDeallocating函数。clearDeallocating函数首先根据指标地址获取具备weak指针地址的数组,然后遍历这么些数组把个中的数目设为nil,最后把这些entry从weak表中删除,最终清理对象的记录。

示范代码:

{ NSObject *obj = [[NSObject alloc] init]; id __weak obj1 = obj;}

当我们初步化一个weak变量时,runtime会调用 NSObject.mm 中的objc_initWeak函数。那个函数在Clang中的注明如下:

id objc_initWeak(id *object, id value);

而对于 objc_initWeak(卡塔尔国 方法的落实

id objc_initWeak(id *location, id newObj) {// 查看对象实例是否有效// 无效对象直接导致指针释放 if  { *location = nil; return nil; } // 这里传递了三个 bool 数值 // 使用 template 进行常量参数传递是为了优化性能 return storeWeakfalse/*old*/, true/*new*/, true/*crash*/> (location, (objc_object*)newObj);}

本文由68399皇家赌场发布于集成经验,转载请注明出处:腾讯一面,包含weak对象的初始化

关键词: 68399皇家赌场 腾讯 原理 初始化 底层

上一篇:让你的照片引爆朋友圈,这里都有了

下一篇:没有了

最火资讯