第十八讲: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
一个有意思的事情,如果我们把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]