年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 65100|回复: 1

第十八讲:Objective-C内存管理之"NSMutableArray"

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

    [LV.9]以坛为家II

    发表于 2014-1-12 12:20:25 | 显示全部楼层 |阅读模式
    本帖最后由 Sian 于 2014-1-12 13:23 编辑

    本讲的主要内容是想说明一个问题:NSMutableArray在进行addObject操作时会将该对象进行一次retain操作,事实上OC的其他数据结构或自带的方法与属性同样具体该特性; 以下是程序实现:
    Dog.h
    1. //
    2. //  Dog.h
    3. //  Memory_myArray
    4. //
    5. //  Created by yusian on 14-1-12.
    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_myArray
    4. //
    5. //  Created by yusian on 14-1-12.
    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_myArray
    4. //
    5. //  Created by yusian on 14-1-12.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. #import "Dog.h"
    10. int main(int argc, const char * argv[])
    11. {
    12.     @autoreleasepool {
    13.         
    14.         
    15.         NSMutableArray * array = [[NSMutableArray alloc] init];
    16.         
    17.         for (int i = 0 ; i < 3 ; i ++)
    18.         {
    19.             Dog * dog = [[Dog alloc] init];
    20.             [dog setID:i];
    21.             NSLog(@"%ld",[dog retainCount]);
    22.             [array addObject:dog];//Array在进行addObject操作时自动将对象的retainCount加1
    23.             NSLog(@"%ld",[dog retainCount]);
    24.             [dog release];
    25.         }
    26.         for (Dog * d in array)
    27.         {
    28.             NSLog(@"dog %d is in array",[d ID]);
    29.         }
    30.         
    31.         [array release];                //数组进行release操作会自动将数组中引用的对象进行releae,从而dog会因再次releae而dealloc
    32.     }
    33.     return 0;
    34. }
    复制代码
    输出结果:
    1. 2014-01-12 12:15:37.609 Memory_myArray[2061:303] 1
    2. 2014-01-12 12:15:37.610 Memory_myArray[2061:303] 2
    3. 2014-01-12 12:15:37.611 Memory_myArray[2061:303] 1
    4. 2014-01-12 12:15:37.611 Memory_myArray[2061:303] 2
    5. 2014-01-12 12:15:37.611 Memory_myArray[2061:303] 1
    6. 2014-01-12 12:15:37.612 Memory_myArray[2061:303] 2
    7. 2014-01-12 12:15:37.612 Memory_myArray[2061:303] dog 0 is in array
    8. 2014-01-12 12:15:37.612 Memory_myArray[2061:303] dog 1 is in array
    9. 2014-01-12 12:15:37.613 Memory_myArray[2061:303] dog 2 is in array
    10. 2014-01-12 12:15:37.612 Memory_myArray[2061:303] dog 0 is dealloc
    11. 2014-01-12 12:15:37.612 Memory_myArray[2061:303] dog 1 is dealloc
    12. 2014-01-12 12:15:37.612 Memory_myArray[2061:303] dog 2 is dealloc
    复制代码
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

     楼主| 发表于 2014-1-12 12:33:02 | 显示全部楼层
    一个有意思的事情,如果我们把Dog * dog = [[Dog alloc] init]放到外面去,结果会怎样?
    代码修改为:
    1. //
    2. //  main.m
    3. //  Memory_myArray
    4. //
    5. //  Created by yusian on 14-1-12.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. #import "Dog.h"
    10. int main(int argc, const char * argv[])
    11. {
    12.     @autoreleasepool {
    13.         
    14.         
    15.         NSMutableArray * array = [[NSMutableArray alloc] init];
    16.         
    17.         Dog * dog = [[Dog alloc] init];
    18.         for (int i = 0 ; i < 3 ; i ++)
    19.         {
    20.             [dog setID:i];
    21.             NSLog(@"%ld",[dog retainCount]);
    22.             [array addObject:dog];//Array在进行addObject操作时自动将对象的retainCount加1
    23.             NSLog(@"%ld",[dog retainCount]);
    24.             [dog release];
    25.         }
    26.         for (Dog * d in array)
    27.         {
    28.             NSLog(@"dog %d is in array",[d ID]);
    29.         }
    30.     }
    31.     return 0;
    32. }
    复制代码

    运行结果:
    1. 2014-01-12 12:28:52.035 Memory_myArray[2124:303] 1
    2. 2014-01-12 12:28:52.037 Memory_myArray[2124:303] 2
    3. 2014-01-12 12:28:52.037 Memory_myArray[2124:303] 1
    4. 2014-01-12 12:28:52.038 Memory_myArray[2124:303] 2
    5. 2014-01-12 12:28:52.038 Memory_myArray[2124:303] 1
    6. 2014-01-12 12:28:52.038 Memory_myArray[2124:303] 2
    7. 2014-01-12 12:28:52.039 Memory_myArray[2124:303] dog 2 is in array
    8. 2014-01-12 12:28:52.039 Memory_myArray[2124:303] dog 2 is in array
    9. 2014-01-12 12:28:52.039 Memory_myArray[2124:303] dog 2 is in array
    10. Program ended with exit code: 0
    复制代码

    事实上,for循环中并没有创建3相对象,而是同一个对象中的ID值修改了3次,所以在数组中存储的是同一个对象。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-2 11:13 , Processed in 0.045486 second(s), 18 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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