weak底层。 nil、Nil、NULL、NSNull的区别

66:weak底层实现的流程

1: Runtime全局维护了一个全局映射表StripedMap,根据对象的地址能够获取对应的散列表SideTable(注意!!!也有可能是多个对象共用一个散列表),散列表SideTable之中包含有weak表weak_table_t,weak_table_t中根据对象的地址能够查到该对象对应的weak_entry_t实体,weak_entry_t用来管理对象的所有的weak指针,weak指针存储在weak_referrer_t中。

2: 当我们在用__weak修饰对象的时候,运行时Runtime会在底层调用objc_initWeak()方法

3: objc_initWeak()方法会调用storeWeak();

4: storeWeak()这个函数会先判断对象是否初始化,如果未初始化,则进行对象初始化,然后创建对应的SideTable;如果对象已经有SideTable,那么判断weak指针是否需要更新,更新操作就是删除对应location位置的weak_entry_t对象,创建新的weak_entry_t,然后插入到weak表weak_table_t中。

66.1: weak指针移除原理

1、移除时机:调用对象的dealloc方法时,中间会调用clearDeallocating,其中会调用weak_clear_no_lock对weak指针进行移除。

2、移除原理:weak_clear_no_lock底层会获取weak表weak_table_t中的实体weak_entry_t,然后拿到其中的weak_referrer_t,拿到weak_referrer_t之后,遍历并将其中的所有weak指针置为nil,最后把这个weak_entry_t从weak_table_t中移除。

3、weak指针本质:从源码中可以看出weak指针的类型为是objc_object**,是对象的二维指针,就是指向对象地址的指针。

67:nil、Nil、NULL、NSNull的区别

nil:指向一个对象的空指针

Nil:指向一个类的空指针

NULL:指向其他类型(如:基本类型、C类型)的空指针

NSNull:通常表示集合中的空值

举例

NSURL *url = nil;

Class class  = Nil;

int *pointerInt = NULL;

NSArray *array = [NSArray arrayWithObjects:[[NSObject alloc] init], nil, [[NSObject alloc] init], [[NSObject alloc] init], nil];

你可能感兴趣的:(weak底层。 nil、Nil、NULL、NSNull的区别)