ARC机制-自动引用计数

什么是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;
}

猜你喜欢

转载自blog.csdn.net/laya1211/article/details/127980410