Objective - C基础: 第六天 - 3.ARC循环引用
来源:互联网 发布:淘宝网上禁止出售保护 编辑:程序博客网 时间:2024/05/22 13:10
在我们之前的手动引用计数中, 我们都知道在循环引用如果两边使用retain的话, 那么两个对象谁也不会释放谁, 那么在ARC中呢??? 其实也是一个道理, 前面我们知道了ARC的特性, 是使用强弱指针来判断对象是否要被释放, 那么循环引用是否也是一样呢? 下面让我们一起来看看:
例子:
#import <Foundation/Foundation.h>@class Car;@interface Person : NSObject@property (nonatomic, strong) Car *car;@end@implementation Person- (void)dealloc{ NSLog(@"Person对象被释放了.");}@end
#import <Foundation/Foundation.h>@class Person;@interface Car : NSObject@property (nonatomic, strong) Person *person;@end@implementation Car- (void)dealloc{ NSLog(@"Car对象被释放了.");}@end
#import <Foundation/Foundation.h>#import "Person.h"#import "Car.h"int main(int argc, const char * argv[]){ Person *p = [[Person alloc] init]; Car *c = [[Car alloc] init]; p.car = c; c.person = p; return 0;}
运行之后, 什么都不会打印, 因为这两个对象都在相互强引用, 所以谁也不会被释放, 看看示意图:
根据ARC的机制, 只要对象有强指针指向, 那么就不会被释放, 所以例子里也就不会被释放, 想到这里, 有人就应该想到解决办法, 把其中一个改成弱指针, 继续往下看:
#import <Foundation/Foundation.h>@class Car;@interface Person : NSObject@property (nonatomic, weak) Car *car;@end
这里把Person里面的Car改成weak, 再看看打印结果:
2015-01-29 14:28:58.283 2.ARC循环引用[3087:255117] Car对象被释放了.2015-01-29 14:28:58.284 2.ARC循环引用[3087:255117] Person对象被释放了.
示意图:
当c和p被释放后, 那么Person就会被释放, 它里面的_car是weak指针, 所以也会被释放, 一旦整个Person对象被释放了, 那么Car里面的成员变量_Person也会被释放, 紧接着Car也会被释放, 所以打印出来的结果就会全部对象被释放~~~
总结:
1. 在ARC机制中的循环引用解决方案:
1> 一端为strong指针, 另一端为weak指针.
2> assign一般只用在基本数据类型.
2.在非ARC机制中的循环引用解决方案:
1> 一端为retain指针, 另一端为assgin指针.
好了, 这次我们就讲到这里, 下次我们继续~~
0 0
- Objective - C基础: 第六天 - 3.ARC循环引用
- Objective - C基础: 第六天 - 1.ARC自动引用计数的基本认识
- Objective - C基础: 第六天 - 2.ARC转换以及第三方框架的ARC管理
- Objective-c - ARC机制下的循环引用
- Objective - C基础: 第六天 - 2.ARC转换以及第三方框架的管理
- Objective-c 循环引用
- Objective-C 循环引用
- Effective Objective-C(第29-36条)内存管理篇,ARC、循环引用、引用计数
- Objective-C内存管理第六弹:ARC
- OC基础-零基础学习Objective-C:第六部分.ARC内存管理
- Objective - C基础: 第五天 - 6.循环引用
- Objective-C - 循环引用问题
- Objective-C基础——ARC
- Objective - C基础: 第六天 - 4.block数据类型
- Objective-C - ARC(Automatic Reference Counting)自动引用技术详解
- Objective-C 循环引用的处理
- objective-c基础语法学习之--(6)内存管理经典问题:循环引用
- [objective-c] ARC 补充
- js 获取radio的选中值 和checkbox 的选中值
- CAGradientLayer的一些属性解析
- 一贴学会PHP 新手入门教程
- 前端攻城狮这一堆东西的来由
- 解决eclipse连接不到genymotion的问题
- Objective - C基础: 第六天 - 3.ARC循环引用
- 水面效果的2D实现
- js 获取radio的选中值 和checkbox 的选中值
- Android开发的一些需要注意的细节
- import,reload,__import__在python中的区别
- js 获取radio的选中值 和checkbox 的选中值
- 开发一个EJB应用
- Android内存泄露及分析
- hdu 1397 Goldbach's Conjecture