OC内存管理(ARC)

来源:互联网 发布:编程c图形库砖块金字塔 编辑:程序博客网 时间:2024/05/18 01:56

一、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]
    3.@property的参数:

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

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

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

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

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

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


四、控制ARC功能的开关
    1.点选当前project最上的设置文件

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

    注意:

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

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

~验证ARC回收对象机制

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

 

②再次重写dealloc,通过打印语句验证ARC是否起作用


③通过运行结果可知,ARC帮助我们管理了内存



五、解决循环引用

1.ARC
    一端用strong,一端用weak

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

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

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

0 0
原创粉丝点击