weak和strong引用计数的区别

环境:ARC
以代码演示为主
获取引用计数的方法:CFGetRetainCount((__bridge CFTypeRef)(obj))

  1. 创建一个对象 :
NSObject *obj1 = [NSObject new];
// obj1 的引用计数为:1
  1. 创建另一个强引用对象2,指向对象1
 MyObject *obj2 = obj1;
// obj1 的引用计数为:2
// obj2 的引用计数为:2
  1. 创建另一个弱引用对象3,指向对象1
 __weak MyObject *weakObj3 = obj1;
// obj1 的引用计数为:2
// obj2 的引用计数为:2
// weakObj3 的引用计数为:3
  1. 创建另一个强引用对象4,指向对象1
MyObject *obj4 = obj1;
// obj1 的引用计数为:3
// obj2 的引用计数为:3
// weakObj3 的引用计数为:4
// obj4 的引用计数为:3
  1. 创建另一个强引用对象5,指向弱引用指针对象3
MyObject *obj5 = obj3;
// obj1 的引用计数为:4
// obj2 的引用计数为:4
// weakObj3 的引用计数为:5
// obj4 的引用计数为:4
// obj5 的引用计数为:4
  1. 创建另一个弱引用对象6,指向强引用指针对象1
__weak MyObject *weakObj6 = obj1;
// obj1 的引用计数为:4
// obj2 的引用计数为:4
// weakObj3 的引用计数为:5
// obj4 的引用计数为:4
// obj5 的引用计数为:4
// weakObj6 的引用计数为:5

总结:
同一内存地址

  1. 强引用计数并不包括弱引用计数。
  2. 弱引用计数比强引用计数多 1(1个不为强引用认可的弱引用)
  3. 当强引用为0、也就是弱引用为1时,这些强弱指针所指向的内存地址会被释放。
  4. 弱引用不会影响内存地址的释放

你可能感兴趣的:(weak和strong引用计数的区别)