年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2786|回复: 0

第十六讲:Objective-C内存管理之“黄金法则”

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

    [LV.9]以坛为家II

    发表于 2014-1-11 23:11:28 | 显示全部楼层 |阅读模式
    Person.h
    1. //
    2. //  Person.h
    3. //  memory
    4. //
    5. //  Created by yusian on 14-1-11.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. #import "Dog.h"
    10. @interface Person : NSObject
    11. {
    12.     Dog * _dog;
    13. }
    14. - (void) setDog:(Dog *)aDog;
    15. - (Dog *) dog;
    16. @end
    复制代码
    Person.m
    1. //
    2. //  Person.m
    3. //  memory
    4. //
    5. //  Created by yusian on 14-1-11.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import "Person.h"
    9. @implementation Person
    10. - (Dog *) dog{
    11.     return _dog;
    12. }
    13. - (void) setDog:(Dog *)aDog{
    14.     if (aDog != _dog) {
    15.         [_dog release];
    16.         _dog = [aDog retain];
    17.     }
    18. }
    19. - (void) dealloc{
    20.     NSLog(@"Person is dealloc!");
    21.     [_dog release];
    22.     [super dealloc];
    23. }
    24. @end
    复制代码
    Dog.h
    1. //
    2. //  Dog.h
    3. //  memory
    4. //
    5. //  Created by yusian on 14-1-11.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. @interface Dog : NSObject
    10. {
    11.     int _ID;
    12. }
    13. @property int ID;
    14. @end
    复制代码
    Dog.m
    1. //
    2. //  Dog.m
    3. //  memory
    4. //
    5. //  Created by yusian on 14-1-11.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import "Dog.h"
    9. @implementation Dog
    10. @synthesize ID = _ID;
    11. - (void) dealloc{
    12.     NSLog(@"Dog %d is dealloc!",_ID);
    13.     [super dealloc];
    14. }
    15. @end
    复制代码
    main.m
    1. //
    2. //  main.m
    3. //  memory
    4. //
    5. //  Created by yusian on 14-1-11.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. #import "Dog.h"
    10. #import "Person.h"
    11. int main(int argc, const char * argv[])
    12. {
    13.     @autoreleasepool {
    14.         
    15.         Dog * dog1 = [[Dog alloc] init];
    16.         
    17.         Dog * dog2 = [[Dog alloc] init];
    18.         
    19.         Person * sim = [[Person alloc] init];
    20.         
    21.         Person * sian = [[Person alloc] init];
    22.         
    23.         [dog1 setID:1];
    24.         
    25.         [dog2 setID:2];
    26.         
    27.         NSLog(@"//初始化两条狗");
    28.         NSLog(@"dog %d retainCount1 is %ld",[dog1 ID],[dog1 retainCount]);
    29.         NSLog(@"dog %d retainCount1 is %ld",[dog2 ID],[dog2 retainCount]);
    30.         
    31.         [sim setDog:dog1];//sim开始遛狗dog1
    32.         
    33.         NSLog(@"//sim开始遛狗dog1");
    34.         NSLog(@"dog %d retainCount2 is %ld",[dog1 ID],[dog1 retainCount]);
    35.         NSLog(@"dog %d retainCount2 is %ld",[dog2 ID],[dog2 retainCount]);
    36.         
    37.         [sian setDog:dog1];//sian开始遛狗dog1
    38.         
    39.         NSLog(@"//sian开始遛狗dog1");
    40.         NSLog(@"dog %d retainCount3 is %ld",[dog1 ID],[dog1 retainCount]);
    41.         NSLog(@"dog %d retainCount3 is %ld",[dog2 ID],[dog2 retainCount]);
    42.         
    43.         [sim setDog:dog2];//sim开始遛狗dog2
    44.         
    45.         NSLog(@"//sim开始遛狗dog2");
    46.         NSLog(@"dog %d retainCount4 is %ld",[dog1 ID],[dog1 retainCount]);
    47.         NSLog(@"dog %d retainCount4 is %ld",[dog2 ID],[dog2 retainCount]);
    48.         
    49.         [sian setDog:dog2];//sian开始遛狗dog2
    50.         
    51.         NSLog(@"//sian开始遛狗dog2");
    52.         NSLog(@"dog %d retainCount5 is %ld",[dog1 ID],[dog1 retainCount]);
    53.         NSLog(@"dog %d retainCount5 is %ld",[dog2 ID],[dog2 retainCount]);
    54.         
    55.         [sim release];//sim离开
    56.         
    57.         NSLog(@"//sim离开");
    58.         NSLog(@"dog %d retainCount6 is %ld",[dog1 ID],[dog1 retainCount]);
    59.         NSLog(@"dog %d retainCount6 is %ld",[dog2 ID],[dog2 retainCount]);
    60.         
    61.         [sian release];//sian离开
    62.         
    63.         NSLog(@"//sian离开");
    64.         NSLog(@"dog %d retainCount7 is %ld",[dog1 ID],[dog1 retainCount]);
    65.         NSLog(@"dog %d retainCount7 is %ld",[dog2 ID],[dog2 retainCount]);
    66.         
    67.         NSLog(@"//dog1 and dog2 is release");
    68.         [dog1 release];
    69.         [dog2 release];
    70.         
    71.         
    72.     }
    73.     return 0;
    74. }
    复制代码
    输出结果:
    1. 2014-01-11 23:08:52.260 memory[834:303] //初始化两条狗
    2. 2014-01-11 23:08:52.261 memory[834:303] dog 1 retainCount1 is 1
    3. 2014-01-11 23:08:52.261 memory[834:303] dog 2 retainCount1 is 1
    4. 2014-01-11 23:08:52.262 memory[834:303] //sim开始遛狗dog1
    5. 2014-01-11 23:08:52.262 memory[834:303] dog 1 retainCount2 is 2
    6. 2014-01-11 23:08:52.262 memory[834:303] dog 2 retainCount2 is 1
    7. 2014-01-11 23:08:52.263 memory[834:303] //sian开始遛狗dog1
    8. 2014-01-11 23:08:52.263 memory[834:303] dog 1 retainCount3 is 3
    9. 2014-01-11 23:08:52.263 memory[834:303] dog 2 retainCount3 is 1
    10. 2014-01-11 23:08:52.264 memory[834:303] //sim开始遛狗dog2
    11. 2014-01-11 23:08:52.264 memory[834:303] dog 1 retainCount4 is 2
    12. 2014-01-11 23:08:52.264 memory[834:303] dog 2 retainCount4 is 2
    13. 2014-01-11 23:08:52.265 memory[834:303] //sian开始遛狗dog2
    14. 2014-01-11 23:08:52.265 memory[834:303] dog 1 retainCount5 is 1
    15. 2014-01-11 23:08:52.265 memory[834:303] dog 2 retainCount5 is 3
    16. 2014-01-11 23:08:52.266 memory[834:303] Person is dealloc!
    17. 2014-01-11 23:08:52.266 memory[834:303] //sim离开
    18. 2014-01-11 23:08:52.266 memory[834:303] dog 1 retainCount6 is 1
    19. 2014-01-11 23:08:52.267 memory[834:303] dog 2 retainCount6 is 2
    20. 2014-01-11 23:08:52.267 memory[834:303] Person is dealloc!
    21. 2014-01-11 23:08:52.267 memory[834:303] //sian离开
    22. 2014-01-11 23:08:52.268 memory[834:303] dog 1 retainCount7 is 1
    23. 2014-01-11 23:08:52.268 memory[834:303] dog 2 retainCount7 is 1
    24. 2014-01-11 23:08:52.268 memory[834:303] //dog1 and dog2 is release
    25. 2014-01-11 23:08:52.269 memory[834:303] Dog 1 is dealloc!
    26. 2014-01-11 23:08:52.269 memory[834:303] Dog 2 is dealloc!
    27. Program ended with exit code: 0
    复制代码

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

    本版积分规则

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

    GMT+8, 2024-5-5 23:09 , Processed in 0.051387 second(s), 18 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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