为了管理所有对象的引用计数和weak指针,苹果创建了一个全局的SideTables,虽然名字后面有个"s"不过他其实是一个全局的Hash表,里面的内容装的都是SideTable结构体而已。它使用对象的内存地址当它的key。管理引用计数和weak指针就靠它了。
当我们通过SideTables[key]来得到SideTable的时候,SideTable的结构如下:
struct SideTable {
spinlock_t slock;//自旋锁,效率高,适用于锁定时间短的场景
RefcountMap refcnts;//map
weak_table_t weak_table;
};
为什么这里还需要一个map RefcountMap 呢?因为对象的数量异常庞大,比如现在有80个同学,我们不可能让每个同学住一个房间,为了节约空间,我们安排10个宿舍,每个宿舍住8个人,然后,当查找对象时,先根据地址找到对应的房间(sidetable),然后根据RefcountMap找到具体某个床位。 具体的床位里存储着引用计数值。
概述: runtime对于注册的类,会进行布局,对于weak指向的类,会存在一个哈希表中,以对象的内存地址作为key,弱指针作为value。一旦对象释放,调用dealloc方法,会在表中查找所有key为此内存地址的弱指针,将他们置为nil。
/**
* The global weak references table. Stores object ids as keys,
* and weak_entry_t structs as their values.
*/
struct weak_table_t {
weak_entry_t *weak_entries;
size_t num_entries;
uintptr_t mask;
uintptr_t max_hash_displacement;
};
locaiton指的是这个weak指针的地址。
newobj指的是weak指向的对象
id objc_storeWeak(id *location, id newObj)
storeWeak 函数用于为 weak 属性赋值 (包括销毁)
objc_loadWeakRetained 函数用于获取 weak 属性
参考链接: blog.csdn.net/iJason92/ar… www.jianshu.com/p/8577286af… dayon.gitbooks.io/-ios/conten…