基本简介
ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化
基本原理
规则
ARC 的规则非常简单:只要还有一个强指针变量指向对象,对象就会保持在内存中
强指针和弱指针
默认所有实例变量和局部变量都是Strong指针
弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误
使用注意
不能调用release、retain、autorelease、retainCount
可以重写dealloc,但是不能调用[super dealloc]
@property : 想长期拥有某个对象,应该用strong,其他对象用weak
其他基本数据类型依然用assign
两端互相引用时,一端用strong、一端用weak
ARC的判断准则:只要没有强指针指向对象,就会释放对象
1.ARC特点
1> 不允许调用release、retain、retainCount
2> 允许重写dealloc,但是不允许调用[super dealloc]
3> @property的参数
* strong :成员变量是强指针(适用于OC对象类型)
* weak :成员变量是弱指针(适用于OC对象类型)
* assign : 适用于非OC对象类型
4> 以前的retain改为用strong
指针分2种:
1> 强指针:默认情况下,所有的指针都是强指针 __strong
2> 弱指针:__weak
看下面的例子
----------------------------------------------------------------------------------
int main()
{
Dog *d = [[Dog alloc] init]; //指针d指向一个Dog对象
Person *p = [[Person alloc] init]; //指针P指向一个Person对象;
p.dog = d; //人的_dag指向 d
d = nil; //d指向空
NSLog(@"%@", p.dog); //默认输出的是 类名和地址,
return 0;
}
运行结果是:
[4208:303] <Dog: 0x100203600> //当d指向空时, d并没有马上被释放, 因为人得_car还在指向dog 说以还能打印
[4208:303] Person is dealloc //程序运行结束, p被销毁, Pesson被释放, _car随着也被销毁,
[4208:303] Dog is dealloc //dog被释放
void test()
{
//__weak Person *p = [[Person alloc] init]; // 错误写法(没有意义的写法)创建即被销毁
Person *p = [[Person alloc] init]; //创建对象
NSLog(@"%@", p); //输出类名和地址
NSLog(@"------------");
}
运行结果是:
[4265:303] <Person: 0x100106c80>
[4265:303] ------------
[4265:303] Person is dealloc
#import "Person.h"
@implementation Person
- (void)dealloc
{
NSLog(@"Person is dealloc");
// [super dealloc];
}
@end
#import "Dog.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"Dog is dealloc");
}
@end
当两端循环引用的时候,解决方案:
1> ARC
1端用strong,另1端用weak
2> 非ARC
1端用retain,另1端用assign
看下面的例子
----------------------------------------------------------------------------------------------------
int main()
{
Person *p = [[Person alloc] init]; //创建person对象
Dog *d = [[Dog alloc] init]; //创建dog对象
p.dog = d; //_dog指向 d 这是个弱指针!
d.person = p; //_person指向 p
return 0;
}
运行结果:
[4496:303] Person--dealloc
[4496:303] Dog--dealloc
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic, strong) Dog *dog;
@end
#import "Person.h"
@implementation Person
- (void)dealloc
{
NSLog(@"Person--dealloc");
}
@end
#import <Foundation/Foundation.h>
@class Person;
@interface Dog : NSObject
@property (nonatomic, weak) Person *person;
@end
#import "Dog.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"Dog--dealloc");
}
@end
当两端循环引用的时候,解决方案:
1> ARC
1端用strong,另1端用weak
2> 非ARC
1端用retain,另1端用assign----------------------