博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARC机制
阅读量:2351 次
发布时间:2019-05-10

本文共 1575 字,大约阅读时间需要 5 分钟。

 iPhone4之后,iOS4.3之后才出现ARC机制

一:基本概念: ARC简单,不用程序员再去管理内存,有两个比较重要的概念

》1:强指针 :strong

》2:弱指针:weak

 注意:

只要有强指针指向一个对象,那么系统就不会回收该对象

只要没有强指针指向对象,系统立即回收该对象 // 与java的垃圾回收机制的不同

弱指针不影响对象被回收

默认情况下,所有的指针都是强指针类型

还可以重写dealloc方法,来进行检查

-(void)dealloc

{

         // [super dealloc];   不能够再调用

         //release ,retain  在ARC机制中不能够再去手动调用

         //上面的都是系统自动调用了

       NSLog(@"Person 被释放了");

}

》1:  //创建出来就会被释放掉,因为没有强指针指向该对象

__weak Person *p =[[Person alloc]init];//这一句代码之后对象被回收

》2:弱指针

Person *p =[[Person alloc]init];

__weak Person *p1=p;

p=nil;  //这一句代码之后对象被回收

》3:强指针

void test(Person *v)//Person *v=p;

{

    v=nil;

}

Person *p =[[Person alloc]init];

test(p);

p=nil;  //这一句代码之后对象被回收

》4:强指针

Person *p =[[Person alloc]init];

p=nil;  //这一句代码之后对象被回收

》5:强指针

Person *p =[[Person alloc]init];

Person *p1=p;//这里总共有两个强指针指向该对象 ,Person *p 和Person *p1

p=nil;//这里还有一个强指针指向该对象,Person *p1,不会回收对象

二:ARC机制下的组合关系

创建Person,Car ,继承自NSObject

//ARC机制中strong对应手动内存管理的retain关键字(一定都是应用在对象类型变量上)

//ARC机制中的weak对应 手动内存管理的assign关键字(一定都是应用在对象类型变量上)

@property(nonatomic,strong) Car *car; //强指针类型的对象,会影响对象的回收

@property(nonatomic,weak) Car *car1;//弱指针类型的对象,不会影响对象的回收

@property(nonatomic,assign) Car *car2; //造成疑惑,会导致许多程序员搞不清这个变量到底是strong类型,还是                                                                          weak类型,ARC中不要使用assign,只需用strong和weak

//ARC机制下 基本数据类型 的@property参数使用,与手动内存管理完全一致

@property(nonatomic,assign) int  age;

三:手动内存管理转换成ARC机制(小项目)

 依次点击   Edit > Refactor > Convert to Objective-C ARC   ,选中,Check,Next,Save,就完成了

四:ARC机制与非ARC机制(第三方框架等)共存

选中项目,在Build Phases 下的Compile Sources选中非ARC的文件,在方框中写上   -fno-objc-arc  ,就可以共存了

五:ARC类互相引用问题

 当出现类循环引用的时候,只需要把一方的strong引用改为weak,并且在.h文件中使用@class  类名  的方式,通知.h文件类的存在

如果需要用到类中的方法,在.m文件中使用  #import  "  类名.h"

转载地址:http://vxrvb.baihongyu.com/

你可能感兴趣的文章
Apche Kylin启动报错:UnknownHostException: node1:2181: invalid IPv6 address
查看>>
Apache Kylin 2.3 构建Cube失败
查看>>
Apache Kylin 2.3 样例分析
查看>>
Apache Kylin 2.3 JDBC Java API 示例
查看>>
An internal error occurred during: "Initializing Java Tooling". java.lang.NullPointerException
查看>>
ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
查看>>
IntelliJ IDEA 2018 基本配置
查看>>
Spring+Mybatis+多数据源(MySQL+Oracle)
查看>>
Mybatis读取Oracle数据库Blob字段,输出原文件
查看>>
信用卡反欺诈
查看>>
线性回归
查看>>
浏览器以只读方式打开PDF
查看>>
CDH和HDP下载地址
查看>>
MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9D\x90\xB6"#...' for column
查看>>
.MysqlDataTruncation: Data truncation: Data too long for column 'content' at row 1
查看>>
com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1146177 > 1048576).
查看>>
Elasticsearch 7.x生产配置
查看>>
AccessDeniedException: /opt/elasticsearch-7.0.0/config/elasticsearch.keystore
查看>>
bootstrap-table 父子表 联动表 完整例子
查看>>
Spring Cloud 2.x完整入门Demo样例(Greenwich版本)
查看>>