Sian 发表于 2014-3-20 10:47:33

ARC的运行机制

1、ARC = (Automatic Reference Counting) 即自动引用计数;
2、ARC的原则:只要没有强指针指向对象即刻释放;
3、ARC是编译器特性,编译器替代人工自动添加相关代码,与内存回收机制不同,后者是运行时机制;
4、弱指针创建的对象没有意义,创建出来后即被释放,默认指针都为强指针;
5、函数结束(代码块结束)后变量都会被回收,此时变量所指向的对象如果没有其他强指针指针,对象会回收,注意此时对象被释放并非函数本身将其释放,而是因为没有强指针指向而被释放;

参考代码:
Person.h
//
//Person.h
//ARC
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>
@interface Person : NSObject

@end

Person.m
//
//Person.m
//ARC
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)dealloc
{
    // 标记,如果对象被释放即会输出这句
    NSLog(@"%@ is dealloc", self);
}

@end

main.m
//
//main.m
//ARC
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
void test();
int main()
{
    NSLog(@"Start main...");

    test();
   
    NSLog(@"End main...");
    return 0;
}

void test()
{
    NSLog(@"Test start...");
   
    // 弱指针创建的对象会被立即释放,只能强指针才能hold住对象;
    __weak Person * p = [ init];
   
    // 标记,方便区分对象何时释放
    NSLog(@"1------------------");
   
    // 默认的指针都是强指针,强指针对象在函数结束后被释放
    Person * p1 = [ init];
   
    NSLog(@"2------------------");
   
    {
      Person * p2 = [ init];

    }// 在代码块结束后p2即被释放,原因是代码块结束后指针变量p2会被回收,p2创建的对象无指针指向时会被立即回收;
   
    NSLog(@"3------------------");
   
    NSLog(@"Test end...");
}
运行结果:2014-03-20 10:47:12.744 ARC Start main...2014-03-20 10:47:12.746 ARC Test start...2014-03-20 10:47:12.746 ARC <Person: 0x1002062e0> is dealloc2014-03-20 10:47:12.747 ARC 1------------------2014-03-20 10:47:12.747 ARC 2------------------2014-03-20 10:47:12.747 ARC <Person: 0x100400a60> is dealloc2014-03-20 10:47:12.748 ARC 3------------------2014-03-20 10:47:12.748 ARC Test end...2014-03-20 10:47:12.748 ARC <Person: 0x1002062e0> is dealloc2014-03-20 10:47:12.749 ARC End main...Program ended with exit code: 0

页: [1]
查看完整版本: ARC的运行机制