iOS:Weak指针原理
程序员文章站
2022-03-11 20:00:10
...
大家好,我是OB!今天来聊聊Weak指针!
- (void)viewDidLoad {
[super viewDidLoad];
__strong Animal *strong_animal;
__weak Animal *weak_animal;
__unsafe_unretained Animal *unsafe_animal;
NSLog(@"1111");
{
Animal *animal = [[Animal alloc]init];
// strong_animal = animal;
// weak_animal = animal;
unsafe_animal = animal;
}
NSLog(@"2222 %@",strong_animal); //2222 <Animal: 0x6000030b8670>
NSLog(@"2222 %@",weak_animal); //2222 (null)
NSLog(@"2222 %@",unsafe_animal); //crash
}
如果用__unsafe_unretained
,当对象释放后,在访问指针会crash。
如果用__weak
,当对象释放后,再访问weak_animal
指针为nil
。
我们来看看对象释放时发生了什么?
还会发现
weak_clear_no_lock(&table.weak_table, (id)this);
释放table.weak_table
中的所有的指向对象的weak指针,并且置为nil。
Runtime在程序运行时,将class对象所有指向它的弱指针都放在一个weaklyTable
表里,里面全是指向该对象的weak指针,当对象释放时,调用对象的dealloc方法,该方法底层就会调用一系列方法去释放该对象,以及将指向该对象的weak的指针置空