天天看点

OC ARC机制

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;
}
           
OC ARC机制

继续阅读