ARC 就是自动引用计数, OC中引入的自动引用计数概念和java中的垃圾回收机制不同, java中的垃圾回收是在程序运行时进行判断, 如果某些对象不再需要了,则对其进行释放. 而ARC是一种编译器特性, 是在编译代码中, 合适的位置插入 release方法. 也就不太需要我们程序员去关心, 应当在哪里,在何时插入release方法.
ARC判断准则: 只要没有强指针指向对象就释放
指针分2种
1 强指针: 默认情况下,所有的指针都是强指针 __strong, 有强指针指向对象时, 则不会释放对象
2 弱指针: 弱指针所指向对象不存在了,会自动设置弱指针为nil . 如果只有弱指针指向对象, 则会释放对象
ARC特点
1 不允许调用 release, reatain, retainCount
2 请允重写dealloc, 但不允许调用 [supper dealloc]
3 @property 参数
strong : 生成的成员变量是强指针, 适用于OC对象类型
weak : 生成的成员变量是弱指针, 适用于OC对象类型
assign: 适用于非OC对象类型
示例代码
//
// Cat.h
// ARC
//
// Created by LiuWei on 15/4/17.
// Copyright (c) 2015年 LiuWei. All rights reserved.
//
#import <Foundation/Foundation.h>
@class Person;
@interface Cat : NSObject
// weak 生成弱指针成员变量, 适用于OC对象, 多用于循环引用
// 猫的主人
@property (nonatomic, weak)Person *person;
@end
//
// Cat.m
// ARC
//
// Created by LiuWei on 15/4/17.
// Copyright (c) 2015年 LiuWei. All rights reserved.
//
#import "Cat.h"
@implementation Cat
- (void)dealloc
{
NSLog(@"Cat dealloc");
}
@end
//
// Person.h
// ARC
//
// Created by LiuWei on 15/4/17.
// Copyright (c) 2015年 LiuWei. All rights reserved.
//
#import <Foundation/Foundation.h>
@class Cat;
@interface Person : NSObject
// 在ARC机制下, 指向对象的属性声明不再使用retain, 而使用stong 表明强指针引用.
@property (nonatomic, strong)Cat *cat;
// assign 适用于非OC对象
@property (nonatomic, assign)int age;
@end
//
// Person.m
// ARC
//
// Created by LiuWei on 15/4/17.
// Copyright (c) 2015年 LiuWei. All rights reserved.
//
#import "Person.h"
@implementation Person
- (void)dealloc
{
NSLog(@"Person dealloc");
}
@end
//
// main.m
// ARC
//
// Created by LiuWei on 15/4/17.
// Copyright (c) 2015年 LiuWei. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Cat.h"
int main() {
@autoreleasepool {
Person *p = [[Person alloc]init];
Cat *c = [[Cat alloc]init];
p.cat = c;
p.age = 20;
c.person = p;
NSLog(@"c的主人是: %@, 主人年龄是 %i", c.person, c.person.age);
}
return 0;
}