OC开发之——内存管理ARC(46)

一 ARC介绍

  • ARC是自iOS5之后增加的新特性,完全消除类手动管理内存的繁琐,编译器会自动在适当的地方插入适当的release,retain,autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切
  • ARC是编译器特性,而不是iOS运行时特性,它也不是类似其他语言中的垃圾收集器。因此ARC和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化

二 基本原理

2.1 规则

ARC的规则非常简单:只要还有一个强指针变量指向对象,对象就会保存在内存中

2.2 强指针和弱指针

  • 默认所有实例变量和局部变量都是Strong指针
  • 若指针指向的对象被回收后,若指针会自动变为nil指针,不会引发野指针错误

三 代码

3.1 Dog类

1
2
3
4
5
6
7
8
9
10
11
12
13
//Dog.h
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end

//Dog.m
#import "Dog.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"Dog被回收了----");
}
@end

3.2 Person类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Person.h
#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
@property (nonatomic,strong) Dog *dog;
@end

//Person.m
#import "Person.h"
@implementation Person
- (void)dealloc
{
NSLog(@"Person 被回收了");
}
@end

3.3 main.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
__strong Person *p=[[Person alloc]init];
__weak Dog *d=[[Dog alloc]init];
p.dog=d;
}
return 0;
}

四 使用注意

  • 不能调用release,retain,autorelease,retainCount
  • 可以重写dealloc,但是不能调用[super dealloc]
  • @property:想长期拥有某个对象,应该用strong,其他对象用weak
    • 其他基本数据类型依然用assign
    • 两端相互引用时,一端用strong,一端用weak