【黑马程序员】ARC概念及原理

本文详细介绍了Objective-C中的自动引用计数(ARC),包括强指针和弱指针的概念,ARC的工作原理、判断准则和机制,以及在循环引用、内存管理上的特点和注意事项。ARC通过编译器自动插入release和autorelease,简化了内存管理,但开发者仍需要注意避免循环引用等问题。

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

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 

1、指针分类

       (1)强指针:默认的情况下,所有的指针都是强指针,关键字strong

       (2)弱指针:__weak关键字修饰的指针

声明一个弱指针如下:__weak Person *p;

 

2、什么是ARC? 

        Automatic Reference Counting,自动引用计数,即ARC,在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,releaseautorelease三个关键字就好,这是ARC的基本原则。当ARC开启时,编译器将自动在代码合适的地方插入retain,releaseautorelease,而作为开发者,完全不需要担心编译器会做错。

       ARC与其他语言的“垃圾回收”机制不同。ARC:编译器特性;“垃圾回收”:运行时特性。

 

3、ARC工作原理及判断准则 

       ARCObjective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入releaseautorelease

只要没有强指针指向对象,对象就会被释放。

 

4、ARC机制

        一个对象可以拥有不止一个的持有者(这个类似MRC中的retainCount>1的情况)。

        ARC的一个基本规则即是,只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁。在默认情况下,所有的实例变量和局部变量都是strong类型的。可以说strong类型的指针在行为上和MRC时代retainproperty是比较相似的。

       在ARC机制作用下,所有指向这个对象的weak指针将被置为nil。使用ARC以后,不论是strong还是weak类型的指针,都不再会指向一个dealloce的对象,从根源上解决了意外释放导致的crash

 

5、ARC机制判断

       ARC机制下有几个明显的标志:

       1)不允许调用对象的release等方法;

       2)不允许调用autorelease方法;

       3)再重写父类的dealloc方法时,不能再调用 [super dealloc]。

 

6、ARC工作原理及强弱指针

1)、ARC工作原理详述

        ARCObjective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入releaseautorelease

       ARC的判断准则:只要没有强指针指向对象,对象就会被释放。

2)、强弱指针

       所有的指针默认就是强指针,强指针用__strong标示,弱指针用__week标示

 

7、ARC下循环引用

1)、ARC下循环引用问题

#import <Foundation/Foundation.h>

@class Dog;

@interface Person : NSObject

//dogstrong 强指针

@property(nonatomic,strong) Dog*dog;

@end

 

@class Person;

@interface Dog : NSObject

//狗的主人也是strong 强指针

@property(nonatomic,strongPerson*owner;

@end

 

int main(int argc, const char * argv[]){

    @autoreleasepool{

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

        Dog *d = [[Dog alloc]init];

        //p.dog = d后,仍然能够正常释放

        p.dog = d;

        //当增加d.owner = p;时形成循环引用 

        d.owner = p;

    }

    return 0;

}

 

解决方案:

       循环引入的对象中其中一个对象设置为strong 另一个设置为weak

2)、ARC@property参数

strong:用于OC对象相当于MRC中的retain

weak:用于OC对象相当于MRC中的assign

assign:用于基本数据类型MRC中的assign一样

copy:一般用于NSString, MRC中的copy一样

ARC情况下解决”循环retain”的问题:@property一边用strong,一边用weak。 

 

8、ARC特点及注意事项

(1)、ARC特点总结

       1、不允许调用releaseretainretainCount;

       2、允许重写dealloc,但是不允许调用[superdealloc];

       3、@property的参数:

           strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针

           weak:相当于原来的assign,(适用于OC对象类型),成员变量是弱指针

           assign:适用于非OC对象类型(基础类型)

(2)、ARC使用注意事项

       1、ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作;

       2、__weakPerson*p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针设置为nil

       3、ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]

             @propertynonatomic,strongDog*dog;

             //意味着生成的成员变量_dog是一个强指针,相当于以前的retain

      4、如果换成是弱指针,则换成weak,不需要加__

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值