关于引用指针引用的若干问题 2018-06-15

2018-06-15  本文已影响5人  iOS打怪升级
  1. ARC 下默认指针是强引用:__strong &__weak &__unsafe_unretained的比较
默认强引用:
    Person * p1 = [Person new]; // 相当于 __strong Person * p1 = [Person new];
    Person * p2 = p1; // 相当于 __strong Person * p2 = p1;
    p1 = nil;
    NSLog(@"p1 =%@\n p2 =%@\n ",p1,p2);

    输出:p1 =(null) p2 =<Person: 0x60c000017730>

分析:p1 & p2都采用了强引用,引用计数为2,当p1置空后,计数减一为1 ,那么内存不会释放,所以p2 依旧指向之前的内存地址
------------------
弱引用修饰:
    Person * p1 = [Person new];
    __weak Person * p2 = p1;
    p1 = nil;
    NSLog(@"\np1 =%@\np2 =%@\n ",p1,p2);

    输出:p1 =(null) p2 =(null)

分析:p2采用弱引用,那么引用计数不会增加,依旧为1,当p1置空后,计数减1为0 ,那么内存释放,因为weak 特性,会将p2 也置空
------------------
不安全修饰引用修饰:
    Person * p1 = [Person new];
    __unsafe_unretained Person * p2 = p1;
    p1 = nil;
    NSLog(@"\np1 =%@\np2 =%@\n ",p1,p2);

  输出:p1 =(null) p2 = EXC_BAD_ACCESS(崩溃了)
分析:p1 强引用,计数为1,p1置空释放,计数减1 为0,内存释放;p2 指针不为nil ,依旧指向之前的地址,但是该内存已经为僵尸内存,即将释放,所以运行报错

参考:__strong &__weak &__unsafe_unretained的比较

上一篇 下一篇

猜你喜欢

热点阅读