变量和对象之间的引用关系

我们都知道:

  • __strong变量会强引用对象, __weak变量会弱引用对象, 所有权修饰符修饰的是变量, 而不是对象
  • OC的方法默认有两个参数, id self和SEL _cmd, 也可以理解成栈帧里的两个变量

变量在函数间传递时和对象的引用关系

两个控制器A和B, 下面代码写在B, 操作均为从A push到B, 再从B pop回去, 在B的dealloc方法里做打印

- (void)varTest {
    __weak OneViewController *weakSelf = self;
    NSLog(@"%p-%@", &self, self);
    NSLog(@"%p-%@", &weakSelf, weakSelf);
    [self obj1:self obj2:weakSelf obj3:self obj4:weakSelf];
}

- (void)obj1:(OneViewController *)obj1 obj2:(OneViewController *)obj2 obj3:(__weak OneViewController *)obj3 obj4:(__weak OneViewController *)obj4 {
    NSLog(@"%p-%@", &self, self);
    NSLog(@"%p-%@", &obj1, obj1);
    NSLog(@"%p-%@", &obj2, obj2);
    NSLog(@"%p-%@", &obj3, obj3);
    NSLog(@"%p-%@", &obj4, obj4);
    
    self.block = ^{
//        NSLog(@"%@", obj1);
//        NSLog(@"%@", obj2);
//        NSLog(@"%@", obj3);
//        NSLog(@"%@", obj4);
    };
}
复制代码

obj1为__strong接收__strong

obj2为__strong接收__weak // 这里是重点

obj3为__weak接收__strong

obj4为__weak接收__weak

分别打开4个log

WechatIMG3889

可以看到

所有的变量地址都不一样, 对应位置的不同是因为在不同栈帧里, 而引用的对象都是同一个

__strong接收的都产生了循环引用, __weak接收的都未产生循环引用

obj2可能疏忽的点在于以为传递的是弱引用而不会产生循环引用

再简化一下obj2的情况

总结: 变量引用对象, 变量赋值变量使对象多了引用, 引用的强弱取决于接收变量的所有权修饰符, 所有权修饰符是不会传递的!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享