在前面学习内存管理的时候,我们知道,ARC(Autom Reference Counting)是一个编译器特性,会自动帮我们release,是IOS5的新功能。现在,我们来学习一下ARC的具体用法。
一、ARC的特性
1.内存管理方法都不能使用了
当我们开启了项目的ARC后会发现
我们在main中创建一个新对象
int main(int argc, const char * argv[])
{
Person *p = [[Person alloc] init];
return 0;
}
会自动释放对象
2.允许重写deallloc,但不允许调用[super dealloc];
3.@property的参数:
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对象的指针变为弱指针,两个对象成功释放。
五、非ARC项目转ARC
选择Edit->Refactor->Convert to Objective-C ARC菜单
会将整个非ARC项目转为ARC项目。
如果想让部分文件保留非ARC特性
点击项目,选择Build Phases,双击需要改变的文件,在Compiler Flags里加入编译参数“-fno-objc-arc”即可。
同样地,如果想一个非ARC项目的部分文件具有ARC特性,将这些文件的Compiler Flag改成“-f-objc-arc”