内存管理 之 Weak

2019-01-18  本文已影响16人  ychen3022
1、实例
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //情况1
    __strong Person *person1;
   //情况2
    __weak Person *person2;
   //情况3
    __unsafe_unretained Person *person3;
    
    NSLog(@"1");
    {
        Person *person = [[Person alloc] init];
        person.age = 10;
        person1 = person;//分别用person1、person2、person3
    }
    NSLog(@"2");
    NSLog(@"3 person = %@",person1);//分别用person1、person2、person3
}

@end


打印结果:
==========================================
情况1:person1
1
2
3 person = <Person: 0x280550ac0>
person dealloc

==========================================
情况2:person2
1
person dealloc
2
3 person = (null)

==========================================
情况3:person3
1
person dealloc
2
崩溃

从结果可以看出,

2、weak指针原理
在上篇文章学习引用计数的时候,我们已经了解到有SideTable这样的一个结构: 屏幕快照 2019-01-21 下午3.17.50.png

其中的refcnts存贮着引用计数,weak_table则存贮这个对象的所有weak指针。
weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象指针的地址)数组。
分析源码,weak 的实现原理可以概括一下三步:

3、总结
上一篇 下一篇

猜你喜欢

热点阅读