runtime 对注册的类, 会进行布局,对于 weak 对象会放入一个 hash 表中。 用 weak 指向的对象内存地址作为 key,当此对象的引用计数为0的时候会 dealloc,假如 weak 指向的对象内存地址是a,那么就会以a为键, 在这个 weak 表中搜索,找到所有以a为键的 weak 对象,从而设置为 nil。
运行期系统会将每一个类的weak变量放入相应的一个hash表中,在这个表中以weak变量所指向的对象的内存地址为key,当weak指向的对象引用计数为0执行dealloc方法,对象被销毁,运行期系统通过key去hash表中找到相应的weak对象将他们设置成nil。
关于hash表的补充:
* Objective-C中的字典NSDictionary底层其实是一个哈希表,实际上绝大多数语言中字典都是通过哈希表实现。
* Objective-C的实现和Java比较类似,当我们需要重写isEqual()方法时,还需要重写hash方法。这两种语言并没有提供一个通用的、默认的哈希函数,主要是考虑到isEqual()方法可能会被重写,两个内存数据不同的对象可能在语义上被认为是相同的。如果使用默认的哈希函数就会得到不同的哈希值,这两个对象就会同时被添加到NSSet集合中,这可能违背我们的期望结果。