欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

我们来看看对象释放时发生了什么?
iOS:Weak指针原理

还会发现

weak_clear_no_lock(&table.weak_table, (id)this);

释放table.weak_table中的所有的指向对象的weak指针,并且置为nil。

Runtime在程序运行时,将class对象所有指向它的弱指针都放在一个weaklyTable表里,里面全是指向该对象的weak指针,当对象释放时,调用对象的dealloc方法,该方法底层就会调用一系列方法去释放该对象,以及将指向该对象的weak的指针置空

相关标签: iOS进阶