启动自动引用计数选项.
选择项目的属性文件 --》 搜索 automatic Reference --》 Objective-C Automatic Reference Counting --》 Yes
ARC 和手动管理内存的区别。
ARC 并不是GC在运行中判断引用计数是否为0,从而清除内存。而是在代码编译之前通过静态分析工具Analyze自动生成内存管理代码。
开启ARC后,不能再使用retain等系列手动内存管的方法,可以重写dealloc方法但不能再方法中[super dealloc]
Core Foundation的东西仍然需要手动release,即以CF打头的对象。因为CF不在ARC的范围内。
未启用ARC之前
@implementation NonARCObject
-(id)initWithName:(NSString *)newName {
self = [super init];
if (self) {
[name release] ;
name = [newName retain];
}
return self;
}
-(void)dealloc {
[name release];
[super dealloc];
}
@end
启用ARC之后
@implementation NonARCObject
-(id)initWithName:(NSString *)newName {
if (self) {
// 编译器自动加入 [name release]; name = [newName retain];
name = newName;
}
return self;
}
@end
强引用和弱引用
强引用和若引用的概念在ARC环境中才存在。
强引用
强引用指的是会使对象引用计数器+1的引用。类似于retain。
当所有强引用全部release 的时候对象才会被清理。
- __strong 关键字来定义强引用
- @property(strong) 来表示强引用属性。
弱引用
弱引用不会使对象引用计数器+1的引用。类似于assgin,直接指针赋值。
- __weak 关键字来定义弱引用
- @property(week) 来表示若引用属性。
什么时候使用若引用?
在ARC环境中经常出现父子引用的情况 。
Person 类中具有Child 类对象指针。
Child 类中具有Person 类对象指针。
如果Person 引用的 Child 指针是强引用,并且Child 引用的Person 类也是强引用,将会导致对象无法释放的问题。
1.Person 类释放会去释放 Child
2.Child 类释放的时候又要去释放Person
父子关系都是强引用,释放的时候会出现循环引用无法释放。
使用若引用即可解决,子类含有父类的若引用。
- Person 类强引用 Child 类。
- Child 类弱引用 Person类。
Person 类释放的时候回去释放Child , Child 发现自身弱引用一个Person 则不会去清理Person,只会将Person 的引用设置为nil ;
若引用引用的对象被清理后,系统自动将引用设置为nil,所以若引用并不会出现僵尸指针的情况
僵尸指针:指向一块被清理掉内存的指针。
时间: 2024-12-25 06:21:24