天天看点

OC内存管理(ARC)

一、ARC的判断准则

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

    代码示例:    

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

           代码解析:默认情况下,p是强指针。当p等于空时,就没有强指针指向Person对象,这时候编译器会自动将Person对象销毁。

二、指针分类

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

    2.弱指针:_ _weak关键字修饰的指针

      声明一个弱指针如下:

__weak Person *p;
           

            ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作(nil指针)。

__weak Person *p=[[Person alloc]  init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针自动清零。

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

@property(nonatomic,strong)Dog *dog;  // 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。

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

三、ARC的特点总结

    1.不允许调用release,retain,retainCount 

    2.不允许重写dealloc,但是不允许调用[super dealloc]

    [email protected]的参数:

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

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

Assign:基本数据类型,直接赋值。(适用于非OC对象)

    4.手动管理内存的retain,全部改为strong,其余不变 

例如:@property (nonatomic, retain) Car *car;

改为:@property (nonatomic, strong) Car *car;

四、控制ARC功能的开关

    1.点选当前project最上的设置文件

OC内存管理(ARC)

    2.在右边的设置选项里找到ARC做出修改(找不到可以搜索ARC)

OC内存管理(ARC)

    注意:

1)在ARC模式下,release 、retain 、retainCount 、autorelease 都是不能调用的。

2)在ARC模式下,不能使用[super dealloc];

~验证ARC回收对象机制

①若想在ARC重写dealloc中调用父类的dealloc,程序报错

OC内存管理(ARC)
②再次重写dealloc,通过打印语句验证ARC是否起作用
OC内存管理(ARC)
③通过运行结果可知,ARC帮助我们管理了内存
OC内存管理(ARC)

五、解决循环引用

1.ARC

    一端用strong,一端用weak

Dog 端 : @property (nonatomic,strong)   Person *person;

Person端:@propertor (nonatomic,weak) Dog *car

OC内存管理(ARC)

2.非ARC

    一端用retain,一端用assign

Dog 端 : @property (nonatomic,retain)   Person *person;

Person端:@propertor (nonatomic,assign) Dog *car

    ★注:字符串是特殊的对象,但不需要使用release手动释放,这种字符串对象默认就是autorelease的,不用额外的去管内存

参考:https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html