什么是ARC
Automatic Reference Counting,自动引用计数,简称ARC
顾名思义,系统自动的帮助我们去计算对象的引用计数器的值
在ARC机制下,我们不再需要手动调用retain、release、autorelease方法,编译器会自动的在合适的地方插入retain、release、autorelease代码
编译器会自动为对象做引用计数,而作为开发者,完全不需要担心编译器会出错
ARC机制下,对象何时会被释放
本质:对象的引用计数器值为0的时候,自动释放
表象:只要没有强指针指向这个对象,这个对象就会立即回收
强指针与弱指针
强指针:默认情况下,我们声明1个指针,这个指针就是1个强指针
我们也可以使用__strong(注意是两个下划线)来显示的声明这是1个强指针
Person *p1;这是1个强指针,指针默认情况下都是强指针
__strong Person *p2;这是1个显示声明的强指针
弱指针:使用__weak标识的指针就叫做弱指针
扫描二维码关注公众号,回复:
16481371 查看本文章
无论是强指针还是弱指针,都是指针,都可以用来存储地址,这1点没有任何区别
都可以通过这个指针访问对象的成员
唯一的区别就是在ARC机制下,它们用来作为回收对象的基准
如果1个对象没有任何强指针指向这个对象的时候,对象就会自动释放
确认程序是否开启ARC机制
(1)默认情况下,Xcode开启ARC机制,你也可以检查一下
(2)ARC机制下,不允许调用retain、release、retainCount、autorelease方法
(3)在dealloc中,不允许[super dealloc]
演示ARC下的单个对象的内存管理
(1)当指向对象的所有的强指针被回收的时候,对象就会被立即回收
int main(int argc, const char *argv[])
{
if(1)
{
//Person类是我们自定义的类,代码省略
Person *p1 = [Person new];//默认情况下,p1是1个强指针
Person *p2 = p1;//p2也是1个强指针,p1、p2都指向Person对象
}//当执行到这里的时候,p1指针被回收,P2也被回收,
//那么Person对象就没有任何强指针指向它了,对象就在这里被回收。
return 0;
}
(2)将所有指向对象的强指针赋值为nil的时候,对象就会被立即回收
int main(int argc, const char *argv[])
{
if(1)
{
//Person类是我们自定义的类,代码省略
Person *p1 = [Person new];//默认情况下,p1是1个强指针
Person *p2 = p1;//p2也是1个强指针,p1、p2都指向Person对象
p1 = nil;//当执行到这句的时候,p1赋值为nil
//p1不再指向Person对象,但p2任然指向Person对象,对象不会被回收
p2 = nil;//p2赋值为nil,p2不再指向Person对象
//此时Person对象没有任何强指针指向它了,对象就在这里被回收。
}
return 0;
}
(3)当对象被回收的时候,原来指向这个对象的弱指针会被自动设置为nil
int main(int argc, const char *argv[])
{
if(1)
{
//Person类是我们自定义的类,代码省略
Person *p1 = [Person new]; //默认情况下,p1是1个强指针
__weak Person *p2 = p1; //p2是1个弱指针,p1、p2都指向Person对象
p1 = nil; //当执行到这句的时候,p1赋值为nil
//p1不再指向Person对象,Person对象没有强指针指向它了,对象被回收
//此时,指向Person对象的弱指针p2会被自动设置为nil
}
return 0;
}