我们都知道:
- __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
可以看到
所有的变量地址都不一样, 对应位置的不同是因为在不同栈帧里, 而引用的对象都是同一个
__strong接收的都产生了循环引用, __weak接收的都未产生循环引用
obj2可能疏忽的点在于以为传递的是弱引用而不会产生循环引用
再简化一下obj2的情况
总结: 变量引用对象, 变量赋值变量使对象多了引用, 引用的强弱取决于接收变量的所有权修饰符, 所有权修饰符是不会传递的!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END