选择项目的属性文件 --》 搜索 automatic Reference --》 Objective-C Automatic Reference Counting --》 Yes
ARC 并不是GC在运行中判断引用计数是否为0,从而清除内存。而是在代码编译之前通过静态分析工具Analyze自动生成内存管理代码。
开启ARC后,不能再使用retain等系列手动内存管的方法,可以重写dealloc方法但不能再方法中[super dealloc]
Core Foundation的东西仍然需要手动release,即以CF打头的对象。因为CF不在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
@implementation NonARCObject
-(id)initWithName:(NSString *)newName {
if (self) {
// 编译器自动加入 [name release]; name = [newName retain];
name = newName;
}
return self;
}
@end
强引用和若引用的概念在ARC环境中才存在。
强引用指的是会使对象引用计数器+1的引用。类似于retain。
当所有强引用全部release 的时候对象才会被清理。
弱引用不会使对象引用计数器+1的引用。类似于assgin,直接指针赋值。
在ARC环境中经常出现父子引用的情况 。
Person 类中具有Child 类对象指针。
Child 类中具有Person 类对象指针。
如果Person 引用的 Child 指针是强引用,并且Child 引用的Person 类也是强引用,将会导致对象无法释放的问题。
1.Person 类释放会去释放 Child
2.Child 类释放的时候又要去释放Person
父子关系都是强引用,释放的时候会出现循环引用无法释放。
使用若引用即可解决,子类含有父类的若引用。
Person 类释放的时候回去释放Child , Child 发现自身弱引用一个Person 则不会去清理Person,只会将Person 的引用设置为nil ;
若引用引用的对象被清理后,系统自动将引用设置为nil,所以若引用并不会出现僵尸指针的情况
僵尸指针:指向一块被清理掉内存的指针。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。