Sian 发表于 2014-1-12 12:20:25

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

本帖最后由 Sian 于 2014-1-12 13:23 编辑

本讲的主要内容是想说明一个问题:NSMutableArray在进行addObject操作时会将该对象进行一次retain操作,事实上OC的其他数据结构或自带的方法与属性同样具体该特性; 以下是程序实现:
Dog.h
//
//Dog.h
//Memory_myArray
//
//Created by yusian on 14-1-12.
//Copyright (c) 2014年 yusian. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Dog : NSObject
{
    int _ID;
}

@property int ID;

@end
Dog.m
//
//Dog.m
//Memory_myArray
//
//Created by yusian on 14-1-12.
//Copyright (c) 2014年 yusian. All rights reserved.
//

#import "Dog.h"

@implementation Dog

@synthesize ID = _ID;

- (void) dealloc{
    NSLog(@"dog %d is dealloc",_ID);
    ;
}

@end
main.m
//
//main.m
//Memory_myArray
//
//Created by yusian on 14-1-12.
//Copyright (c) 2014年 yusian. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Dog.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
      
      
      NSMutableArray * array = [ init];
      

      for (int i = 0 ; i < 3 ; i ++)
      {
            Dog * dog = [ init];
            ;
            NSLog(@"%ld",);

            ;//Array在进行addObject操作时自动将对象的retainCount加1
            NSLog(@"%ld",);
            ;
      }
      for (Dog * d in array)
      {
            NSLog(@"dog %d is in array",);
      }
      
      ;                //数组进行release操作会自动将数组中引用的对象进行releae,从而dog会因再次releae而dealloc
    }
    return 0;
}

输出结果:
2014-01-12 12:15:37.609 Memory_myArray 1
2014-01-12 12:15:37.610 Memory_myArray 2
2014-01-12 12:15:37.611 Memory_myArray 1
2014-01-12 12:15:37.611 Memory_myArray 2
2014-01-12 12:15:37.611 Memory_myArray 1
2014-01-12 12:15:37.612 Memory_myArray 2
2014-01-12 12:15:37.612 Memory_myArray dog 0 is in array
2014-01-12 12:15:37.612 Memory_myArray dog 1 is in array
2014-01-12 12:15:37.613 Memory_myArray dog 2 is in array
2014-01-12 12:15:37.612 Memory_myArray dog 0 is dealloc
2014-01-12 12:15:37.612 Memory_myArray dog 1 is dealloc
2014-01-12 12:15:37.612 Memory_myArray dog 2 is dealloc

Sian 发表于 2014-1-12 12:33:02

一个有意思的事情,如果我们把Dog * dog = [ init]放到外面去,结果会怎样?
代码修改为:
//
//main.m
//Memory_myArray
//
//Created by yusian on 14-1-12.
//Copyright (c) 2014年 yusian. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Dog.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
      
      
      NSMutableArray * array = [ init];
      
      Dog * dog = [ init];

      for (int i = 0 ; i < 3 ; i ++)
      {
            ;
            NSLog(@"%ld",);

            ;//Array在进行addObject操作时自动将对象的retainCount加1
            NSLog(@"%ld",);
            ;
      }
      for (Dog * d in array)
      {
            NSLog(@"dog %d is in array",);
      }
    }
    return 0;
}


运行结果:
2014-01-12 12:28:52.035 Memory_myArray 1
2014-01-12 12:28:52.037 Memory_myArray 2
2014-01-12 12:28:52.037 Memory_myArray 1
2014-01-12 12:28:52.038 Memory_myArray 2
2014-01-12 12:28:52.038 Memory_myArray 1
2014-01-12 12:28:52.038 Memory_myArray 2
2014-01-12 12:28:52.039 Memory_myArray dog 2 is in array
2014-01-12 12:28:52.039 Memory_myArray dog 2 is in array
2014-01-12 12:28:52.039 Memory_myArray dog 2 is in array
Program ended with exit code: 0

事实上,for循环中并没有创建3相对象,而是同一个对象中的ID值修改了3次,所以在数组中存储的是同一个对象。
页: [1]
查看完整版本: 第十八讲:Objective-C内存管理之"NSMutableArray"