返回上级目录:iOS面试专题一
文章目录
- 1.alloc实现
- 2.retain实现
- 3.release实现
- 4.retainCount实现
- 5.dealloc实现(重要)
- 5.1 object_dispose()实现
- 5.2 objc_destructInstance()实现
- 5.3 clearDeallocating()实现
1.alloc实现
2.retain实现
- 通过当前对象的指针,到SideTables()当中去获取他所属的SideTable。SideTables是由多个SideTable组成的一个hash表;通过当前对象的指针,经过hash函数的计算,可以快速的SideTables()当中找到他对应的SideTable
- 在table中去获取引用计数map这样的一个成员变量,通过当前对象的指针,在SideTable的引用计数表中去获取当前对象的引用计数值,refcnts(RefcountMap)是SideTable中的一个成员变量,table.refcnts[this]这个查找过程又是一次hash查找
- 进行了两次hash查找
- 然后对引用计数进行加1操作
- SIDE_TABLE_RC_ONE,实际不是1,有一个偏移量4,因为64位中有两位不是表示引用计数。但引用计数是加了1
问: - 我们在进行retain操作的时候,系统是怎样查找他对应的引用计数的?
经过两次hash查找
3.release实现
和retain比只是引用计数+1变成了-1
4.retainCount实现
- 新alloc的对象find(this),读出来的0。refcnt_result += 0, retainCount返回1
5.dealloc实现(重要)
- nonpointer_isa: 判断当前对象是否使用非指针型isa
- weakly_referenced: 当时对象是否有weak指针指向他
- has_assoc: 判断当前对象是否有关联对象
- has_cxx_dtor: 判断当前对象的内部实现是否有涉及到c++相关的内容,当前对象是否使用arc来管理内存
- 当前对象的引用计数是否通过sidetable中的引用计数表来维护
上面的都为否,可以调用C函数来释放。否则要调用object_dispose()
5.1 object_dispose()实现
5.2 objc_destructInstance()实现
5.3 clearDeallocating()实现