- 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的比较