天天看点

OC学习笔记九---ARC

在前面学习内存管理的时候,我们知道,ARC(Autom Reference Counting)是一个编译器特性,会自动帮我们release,是IOS5的新功能。现在,我们来学习一下ARC的具体用法。

一、ARC的特性

1.内存管理方法都不能使用了

当我们开启了项目的ARC后会发现

OC学习笔记九---ARC
OC学习笔记九---ARC

我们在main中创建一个新对象

int main(int argc, const char * argv[])
{
    Person *p = [[Person alloc] init];
    
    return 0;
}
           

会自动释放对象

OC学习笔记九---ARC

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

[email protected]的参数:

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

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

assign:适用于非OC对象类型

有了这些特性,我们怎么写程序都不用担心内存问题啦!

二、ORC的判断准则

没有调用release方法,ARC是怎么判断是否释放对象呢?

判断准则:只要没有强指针(以前学过的指针都是强指针)指向该对象,对象对自动释放。

上例中,main函数运行结束后,指针变量p被销毁,此时没有强指针指向对象,对象就释放了。

三、弱指针

在指针声明前加上__weak

四、ARC循环引用

新建一个工程,新建Person和Dog类

Person.h

#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic, strong) Dog *dog;
@end
           

Person.m

#import "Person.h"
 
@implementation Person
- (void)dealloc
{
    NSLog(@"Person对象被释放了!");
}
@end
           

Dog.h

#import <Foundation/Foundation.h>
 
@class Person;
@interface Dog : NSObject
@property (nonatomic, strong) Person *person;
@end
           

Dog.m

#import "Dog.h"
 
@implementation Dog
- (void)dealloc
{
    NSLog(@"Dog对象被释放了!");
}
@end
           

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[])
{
    Person *p = [[Person alloc] init];
    Dog *d = [[Dog alloc] init];
    
    p.dog = d;
    d.person = p;
    return 0;
}
           

运行后,发现没有任何输出。这是因为,这两个对象互相引用,并且都是强指针,程序执行完毕后,两个对象产生了都死锁。此时,把任意一个对象的引用变为弱指针即可。

将Person对象的指针变为弱指针,两个对象成功释放。

OC学习笔记九---ARC

五、非ARC项目转ARC

选择Edit->Refactor->Convert to Objective-C ARC菜单

OC学习笔记九---ARC

会将整个非ARC项目转为ARC项目。

如果想让部分文件保留非ARC特性

点击项目,选择Build Phases,双击需要改变的文件,在Compiler Flags里加入编译参数“-fno-objc-arc”即可。

OC学习笔记九---ARC

同样地,如果想一个非ARC项目的部分文件具有ARC特性,将这些文件的Compiler Flag改成“-f-objc-arc”