OC内存管理(ARC)
来源:互联网 发布:编程c图形库砖块金字塔 编辑:程序博客网 时间:2024/05/18 01:56
一、ARC的判断准则
只要没有强指针指向对象,对象就会被释放。
代码示例:
Person *p = [[Person alloc] init];p = nil;
代码解析:默认情况下,p是强指针。当p等于空时,就没有强指针指向Person对象,这时候编译器会自动将Person对象销毁。
1.强指针:默认的情况下,所有的指针都是强指针,关键字strong
2.弱指针:_ _weak关键字修饰的指针
声明一个弱指针如下:
__weak Person *p;
ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作(nil指针)。
__weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针自动清零。
ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]。
@property(nonatomic,strong)Dog *dog; // 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
如果换成是弱指针,则换成weak,不需要加__
三、ARC的特点总结
1.不允许调用release,retain,retainCount
2.不允许重写dealloc,但是不允许调用[super dealloc]
3.@property的参数:
Strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
Weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
Assign:基本数据类型,直接赋值。(适用于非OC对象)
4.手动管理内存的retain,全部改为strong,其余不变
例如:@property (nonatomic, retain) Car *car;
改为:@property (nonatomic, strong) Car *car;
四、控制ARC功能的开关
1.点选当前project最上的设置文件
2.在右边的设置选项里找到ARC做出修改(找不到可以搜索ARC)
注意:
1)在ARC模式下,release 、retain 、retainCount 、autorelease 都是不能调用的。
2)在ARC模式下,不能使用[super dealloc];
~验证ARC回收对象机制
①若想在ARC重写dealloc中调用父类的dealloc,程序报错
②再次重写dealloc,通过打印语句验证ARC是否起作用
③通过运行结果可知,ARC帮助我们管理了内存
五、解决循环引用
1.ARC
一端用strong,一端用weak
Dog 端 : @property (nonatomic,strong) Person *person;
Person端:@propertor (nonatomic,weak) Dog *car
2.非ARC
一端用retain,一端用assign
Dog 端 : @property (nonatomic,retain) Person *person;
Person端:@propertor (nonatomic,assign) Dog *car
★注:字符串是特殊的对象,但不需要使用release手动释放,这种字符串对象默认就是autorelease的,不用额外的去管内存
参考:https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html
- OC内存管理(ARC)
- OC内存管理(非ARC)
- OC内存管理之ARC
- 黑马程序员---OC基础---内存管理(MRC、ARC)
- OC的ARC(自动内存管理)注意事项
- OC-049.集合中的内存管理(MRC和ARC)
- ARC/OC对象自动管理内存
- oc的ARC的内存管理
- OC内存管理--MRC&ARC
- OC内存管理 MRC与ARC
- OC的内存管理方式----MRC & ARC
- OC内存管理-ARC-循环引用
- 黑马程序员——OC内存管理(非ARC,手工管理)
- Swift内存管理(ARC)
- iOS 内存管理(ARC)
- 黑马程序员——OC内存管理复习(非ARC部分)
- 黑马程序员——9、OC语言(内存管理和ARC)
- 黑马程序员——OC基础:内存管理和自动引用计数(ARC)
- 面试常备题---链表总结篇
- AbstractFactory
- 转载自http://blog.csdn.net/fei20072050104/article/details/21785565
- lesson20:
- 学了一段时间的C#,只是想记录一下~用字典实现字符串转换为汉字
- OC内存管理(ARC)
- SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称
- 第十六周OJ项目——指针引出奇数因子
- java.sql.SQLSyntaxErrorException: ORA-00907: 缺失右括号
- csapp2e homework 2.77
- 第十六周项目一-数组的排序
- 深入浅出REST
- poj 2411 Mondriaan's Dream
- MAC上的PHP工作环境搭建