//----------------------ARC概念及原理
ARC是oc的一个内存管理模式,ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Countin)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了
指针分类
(1)"强指针":默认的情况下,所有的指针都是强指针,关键字 strong
(2)"弱指针":__weak关键字修饰的指针(两个下划线)
声明一个弱指针如下:
__weak Person *p;
ARC永远不写"retain","release"和"autorelease"
ARC的判断准则:(当弱类型指向的空间变为nil时,之前的指向空间被释放;如果是强类型,当一个空间中存在多个对象对同一个空间的占有时,即使一个对象指向nil了,只要还存在有对空间的占有对象,它就不会被释放,直到在该释放的地方才结束释放)
只要还有一个"强指针"变量指向对象,对象就会保持在内存中。
"只要没有强指针指向对象,对象就会被释放。"
注意:当使用ARC的时候,暂时忘记"引用计数器",因为判断标准变了
注意:
在ARC中,dealloc方法不能使用[super dealloc];
// ARC环境的判断:怎么知道项目是ARC还是MRC的
1:查看项目的配置信息 build setting-》all level--->auto--->objective--c ARC
2: 查看某些语法是否可用:release/autorelease(查看编译是否通过)
3: 在ARC中,能够重写父类的dealloc方法,但是不能使用【super dealloc】(查看编译是否通过)
//---------------------ARC与单对象的内存管理
总结:
1.当栈区的指向对象的局部变量随着代码块的结束,而被释放,对象就没有了强指针引用了,所以也被释放.
2.当对象被 __weak 修饰 (弱指针) 对象没有被强指针引用就会被"直接释放"
Person *person (指针/局部变量) = (堆区/手动管理) [Person new];
#理解:person 这个栈区的指针(局部变量) ---指向了-----> 堆区的该对象的空间[Person new];
int main(){
# 情况一:
{
Person *person = [Person new];
NSLog(@"----以上释放 / 以下释放-----");
}//此处被释放,因为局部变量person在这个地方被释放了,[Person new]没有强指针指向它了,[Person new]被释放
//------------------------------------------
# 情况二:
{
Person *person = [Person new];
person = nil; // person 这个指针指向发生改变, [Person new]没有强指针指向它了,[Person new]被释放
NSLog(@"----以上释放 / 以下释放-----");
}
//------------------------------------------
# 情况三:
{
__weak Person *person = [Person new];
// 一开始就是没有强指针指向,创建了就立马销毁了
NSLog(@"----以上释放 / 以下释放-----");
}
return 0;
}
//------------------ARC下@property参数
ARC中的@property参数
"strong" : 用于OC对象, 相当于MRC中的"retain"
"weak" : 用于OC对象,释放了之后,会将指针置为nil, 其他相当于MRC中的"assign"
"assign" : 用于基本数据类型, 跟MRC中的assign一样
"copy" : 一般用于NSString, 跟MRC中的copy一样
在ARC情况下解决"循环retain"的问题:@property一边用strong,一边用weak。
//--------------------ARC下循环引用问题
两个强指针一旦相互引用,会造成无法释放
解决方案:
循环引入的对象中其中一个对象设置为"strong" 另一个设置为"weak"
详细看图
ARC特点总结
(1)不允许调用release retain retainCount
(2)允许重写dealloc 但是不允许调用【super dealloc】
(3)@property的参数:
strong:相当于原来的retain(适用于oc对象类型) 成员变量是强指针
weak:相当于原来的assign(同上),成员变量是弱指针
assign:适用于非oc对象类型(基础类型)
//------------------ARC的兼容和转换(注意兼容与转换之间的区别)
#waring ARC(兼容)MRC的类 (将某一个文件转换)
target --> Build Phaese ---> Compiler Sources --> Compiler Flags
让程序兼容ARC和非ARC部分。
转变为非ARC -fno-objc-arc
转变为ARC的, -f-objc-arc
#waring MRC转ARC(将整个项目转换)
Xcode --> refactor --> Convert to Objective-C ARC 选中要装换的target --> 看代码