年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2012|回复: 0

ARC的运行机制

[复制链接]
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

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

    参考代码:
    Person.h
    1. //
    2. //  Person.h
    3. //  ARC
    4. //
    5. //  Created by yusian on 14-3-19.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. @interface Person : NSObject
    10. @end
    复制代码
    Person.m
    1. //
    2. //  Person.m
    3. //  ARC
    4. //
    5. //  Created by yusian on 14-3-19.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "Person.h"
    9. @implementation Person
    10. - (void)dealloc
    11. {
    12.     // 标记,如果对象被释放即会输出这句
    13.     NSLog(@"%@ is dealloc", self);
    14. }
    15. @end
    复制代码
    main.m
    1. //
    2. //  main.m
    3. //  ARC
    4. //
    5. //  Created by yusian on 14-3-19.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. #import "Person.h"
    10. void test();
    11. int main()
    12. {
    13.     NSLog(@"Start main...");
    14.     test();
    15.    
    16.     NSLog(@"End main...");
    17.     return 0;
    18. }
    19. void test()
    20. {
    21.     NSLog(@"Test start...");
    22.    
    23.     // 弱指针创建的对象会被立即释放,只能强指针才能hold住对象;
    24.     __weak Person * p = [[Person alloc] init];
    25.    
    26.     // 标记,方便区分对象何时释放
    27.     NSLog(@"1------------------");
    28.    
    29.     // 默认的指针都是强指针,强指针对象在函数结束后被释放
    30.     Person * p1 = [[Person alloc] init];
    31.    
    32.     NSLog(@"2------------------");
    33.    
    34.     {
    35.         Person * p2 = [[Person alloc] init];
    36.     }// 在代码块结束后p2即被释放,原因是代码块结束后指针变量p2会被回收,p2创建的对象无指针指向时会被立即回收;
    37.    
    38.     NSLog(@"3------------------");
    39.    
    40.     NSLog(@"Test end...");
    41. }
    复制代码
    运行结果:
    2014-03-20 10:47:12.744 ARC[872:303] Start main...
    2014-03-20 10:47:12.746 ARC[872:303] Test start...
    2014-03-20 10:47:12.746 ARC[872:303] <Person: 0x1002062e0> is dealloc
    2014-03-20 10:47:12.747 ARC[872:303] 1------------------
    2014-03-20 10:47:12.747 ARC[872:303] 2------------------
    2014-03-20 10:47:12.747 ARC[872:303] <Person: 0x100400a60> is dealloc
    2014-03-20 10:47:12.748 ARC[872:303] 3------------------
    2014-03-20 10:47:12.748 ARC[872:303] Test end...
    2014-03-20 10:47:12.748 ARC[872:303] <Person: 0x1002062e0> is dealloc
    2014-03-20 10:47:12.749 ARC[872:303] End main...
    Program ended with exit code: 0


    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-5-5 22:52 , Processed in 0.042948 second(s), 19 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表