iOS内存管理之引用计数初识
2017-08-18 21:58
585 查看
@property (nonatomic,
strong) NSString *para1;
@property (nonatomic,
copy) NSString *para2;
@property (nonatomic,
strong) NSMutableString *para3;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.para1 =
@"meng";
self.para2 =
@"zq";
self.para3 = [[NSMutableString
alloc] initWithString:@"meng123"];
NSMutableArray *array = [[NSMutableArray
alloc] initWithObjects:self.para1,
self.para2,
nil];
[array addObject:self.para3];
//para1的指针地址,para1对象的地址
NSLog(@"%p, %p", &_para1,
self.para1);
//para2的指针地址,para2对象的地址
NSLog(@"%p, %p", &_para2,
self.para2);
NSLog(@"%p, %p", &_para3,
self.para3);
//与para1、para2对象的地址相同,说明是浅拷贝
NSLog(@"%p, %p, %p", [array
objectAtIndex:0], [array
objectAtIndex:1], [array
objectAtIndex:2]);
self.para1 =
@"";
self.para2 =
@"";
[self.para3
appendString:@"456"];
//与para1、para2对象的地址相同,说明是浅拷贝
NSLog(@"****%p, %p****, ****%p", [array
objectAtIndex:0], [array
objectAtIndex:1], [array
objectAtIndex:2]);
//但是打印的结果相同,说明para1和para2改变的是他们的副本,而保存在数组里面的是它们的原值
NSLog(@"%@, %@, %@", [array
objectAtIndex:0], [array
objectAtIndex:1], [array
objectAtIndex:2]);
//指针地址没变,但是指针指向的对象的地址变了,说明para1盒para2改变的只是它的副本
NSLog(@"second %p, %p", &_para1,
self.para1);
NSLog(@"second %p, %p", &_para2,
self.para2);
//指针地址没变,指针指向的对象的地址也没变,说明是浅拷贝
NSLog(@"second %p, %p", &_para3,
self.para3);
//把para3置空,检验数组是否还有para3
//执行次代码之后para3仍然存活,因为数组还在引用它。但我们不能假设它一定存活,释放它之后仍然打印它的地址是不好的习惯
self.para3 =
nil;
NSLog(@"%p",
self.para3);
//因为数组在para3上调用了retain,以期继续保留para3,所以它的引用计数为2,当self.para3释放之后,数组仍然拥有para3
NSLog(@"%p", [array
objectAtIndex:2]);
}
strong) NSString *para1;
@property (nonatomic,
copy) NSString *para2;
@property (nonatomic,
strong) NSMutableString *para3;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.para1 =
@"meng";
self.para2 =
@"zq";
self.para3 = [[NSMutableString
alloc] initWithString:@"meng123"];
NSMutableArray *array = [[NSMutableArray
alloc] initWithObjects:self.para1,
self.para2,
nil];
[array addObject:self.para3];
//para1的指针地址,para1对象的地址
NSLog(@"%p, %p", &_para1,
self.para1);
//para2的指针地址,para2对象的地址
NSLog(@"%p, %p", &_para2,
self.para2);
NSLog(@"%p, %p", &_para3,
self.para3);
//与para1、para2对象的地址相同,说明是浅拷贝
NSLog(@"%p, %p, %p", [array
objectAtIndex:0], [array
objectAtIndex:1], [array
objectAtIndex:2]);
self.para1 =
@"";
self.para2 =
@"";
[self.para3
appendString:@"456"];
//与para1、para2对象的地址相同,说明是浅拷贝
NSLog(@"****%p, %p****, ****%p", [array
objectAtIndex:0], [array
objectAtIndex:1], [array
objectAtIndex:2]);
//但是打印的结果相同,说明para1和para2改变的是他们的副本,而保存在数组里面的是它们的原值
NSLog(@"%@, %@, %@", [array
objectAtIndex:0], [array
objectAtIndex:1], [array
objectAtIndex:2]);
//指针地址没变,但是指针指向的对象的地址变了,说明para1盒para2改变的只是它的副本
NSLog(@"second %p, %p", &_para1,
self.para1);
NSLog(@"second %p, %p", &_para2,
self.para2);
//指针地址没变,指针指向的对象的地址也没变,说明是浅拷贝
NSLog(@"second %p, %p", &_para3,
self.para3);
//把para3置空,检验数组是否还有para3
//执行次代码之后para3仍然存活,因为数组还在引用它。但我们不能假设它一定存活,释放它之后仍然打印它的地址是不好的习惯
self.para3 =
nil;
NSLog(@"%p",
self.para3);
//因为数组在para3上调用了retain,以期继续保留para3,所以它的引用计数为2,当self.para3释放之后,数组仍然拥有para3
NSLog(@"%p", [array
objectAtIndex:2]);
}
相关文章推荐
- iOS内存管理之:引用计数、ARC、自动释放池autoreleasepool和便捷方法之间的关系
- iOS内存管理之:引用计数、ARC、自动释放池autoreleasepool和便捷方法之间的关系
- iOS内存管理之:引用计数、ARC、自动释放池autoreleasepool和便捷方法之间的关系
- iOS内存管理中引用计数的学习
- iOS中引用计数内存管理机制分析总结(NSString引用计数为-1的情况)
- iOS内存管理之:引用计数、ARC、自动释放池autoreleasepool和便捷方法之间的关系
- 移动开发:iOS内存管理之:引用计数、ARC、自动释放池autoreleasepool和便捷方法之间的关系
- iOS中引用计数内存管理机制分析
- iOS内存管理系列之一:对象所有权与引用计数
- iOS中引用计数内存管理机制分析
- iOS中引用计数内存管理机制分析
- IOS内存管理--手动引用计数实现
- iOS中引用计数内存管理机制分析
- iOS中引用计数内存管理机制分析
- iOS内存管理系列之一:对象所有权与引用计数
- IOS开发(16)Objective-C-内存管理-自动引用计数(ARC)
- iOS-学习笔记-内存管理 (1)自动引用计数
- 《Objective-C高级编程 iOS与OS X多线程和内存管理》学习笔记——第一章自动引用计数
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之17-内存管理和自动引用计数——黑马 IOS 技术博客
- iOS中引用计数内存管理机制分析