ARC的理解

本文详细介绍了Objective-C中的自动引用计数(ARC)机制的工作原理及如何避免循环引用等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 本文出处:http://www.onevcat.com/2012/06/arc-hand-by-hand/

1,什么是ARC?

Automatic Reference Counting,自动引用计数。ARC是LLVM3.0编译器的特性。ARC开启时,编译器会自动在代码合适的地方插入retain,release,autorelease,因此代码中永远不用下retain,release,autorelease了。

2,ARC工作原理

   先来介绍下Munaral Reference Counting(MRC)手动引用计数的原理:如果需要持有一个对象,那么对其发送retain,如果之后不再使用该对象,那么对其release或autorelease。每一次对retain,new,alloc的调用,都需要对其进行release或者autorelease。

    其次,ARC的优越性:arc是Object-C编译器的特性,而不是运行时特性或者垃圾回收机制。arc所做的只不过是在代码编译时在合适的位置适当地插入release或autorelease,就如同之前MRC所做的那样,所以在效率上至少不会比MRC低。

3,ARC机制

  ARC的基本机制是只要某个指针被strong指针所指向,那么它就不会被销毁,只要对象没有被任何指针所指向,那么就将销毁。在默认情况下,所有的实例变量和局部变量都是strong类型的,它和mrc情况下,retain的property属性是相似的。

  比如NSString *firstName = self.textField.text;用字符串@“oneV”做为例子。显然这时


两个strong指针同时指向一个对象。如果这时用户在textField里输入了@“oneCat”,那么此时


其中一个strong指针指向了另一个对象。只有当firstName指针也被指向了另一个对象,或者超出了作用范围的空间,那么此时firstName指针也不再持有@“oneV”。在ARC下这种情况发生后,@“oneV”这个对象就会被销毁。


没有strong指针指向,内存释放。

  相反,如果是weak指针,那么该指针并不持有该对象。

_weak  NSString *weakName = self.textField.text;

得到的指向关系是



 一个strong和一个weak指针指向了同一个对象。

如果textField内容改变的话,那么@“oneV”这个对象将被销毁。同时,在arc机制下,所有指向这个对象的weak指针将被置为nil。

  所以在arc机制下,所有的strong和weak指针都不会指向一个dealloced的对象,从根源上解决了意外释放导致的crash。


strong指针指向另外对象,对象被释放,weak自动置为nil.

4,避免循环持有的问题。如delegate设计模式。

viewController有一个strong指针指向UITableView,而UITableView的datasource和delegate都是指向UITableView的weak指针。

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值