被weak修饰的对象在被释放的时候会发生什么?
1.被weak修饰的对象在释放时,weak指针会自动被置为nil。
是如何实现的?
2.系统会把那些被用weak修饰的对象放到一张hash表中,地址为key。在对象被释放之后,通过自身的地址去hash表中找到对应的对象并释放掉,然后将weak指针置为nil。
知道sideTable么?里面的结构可以画出来么?
3.sideTable里有一个操作SideTable时用到的锁、引用计数的值、存weak指针的hash表。
iOS源码:
struct SideTable {
spinlock_t slock;//操作SideTable时用到的锁
RefcountMap refcnts;//引用计数的值
weak_table_t weak_table;//存weak指针的hash表
SideTable() {
memset(&weak_table, 0, sizeof(weak_table));
}
~SideTable() {
_objc_fatal("Do not delete SideTable.");
}
void lock() { slock.lock(); }
void unlock() { slock.unlock(); }
void forceReset() { slock.forceReset(); }
// Address-ordered lock discipline for a pair of side tables.
template<HaveOld, HaveNew>
static void lockTwo(SideTable *lock1, SideTable *lock2);
template<HaveOld, HaveNew>
static void unlockTwo(SideTable *lock1, SideTable *lock2);
};
网友评论