标签:
// 先开启僵尸对象检测 NSObject *obj = [[NSObject alloc] init]; [obj release]; // 野指针错误 [obj log:@"测试"];
// 输出台打印
2016-01-21 19:35:46.367 内存管理[2688:205046] *** -[NSObject log:]: message sent to deallocated instance 0x100113c80 (向一个已经被释放的实例对象发送了消息)
// 最近在网上视频上看到的一个有趣的问题,按照视频上所讲
// 字符串有一个常量池
// 如果你需要的字符串在常量池中已经存在了,不会分配内存空间
// 使用字符串的时候:采用下面1、3、5方式获取的字符串都在常量区(嗯,这三个NSString对象跟视频上讲的一样,确实在字符常量区,因为打印其引用计数是一个巨大的数,所以判断其内存不归用户管)
// 注意:视频上所讲,str2和str4的应该被分配在堆区,即内存归用户管,引用计数应该为1
// 但事实上,看下面打印的str2和str4?瞬间凌乱了,Why,说好的在堆区呢?
NSString *str1 = @"abc";
NSString *str2 = [NSString stringWithFormat:@"aaa"];
NSString *str3 = [NSString stringWithString:@"abc"];
NSString *str4 = [[NSString alloc] initWithFormat:@"aaa"];
NSString *str5 = [[NSString alloc] initWithString:@"abc"];
NSString *str6 = [[NSString alloc] init]; // 在栈区?为啥它的引用计数那么大?
NSLog(@"str1 = %@ , %p , %lu",str1,str1,str1.retainCount);
NSLog(@"str2 = %@ , %p , %lu",str2,str2,str2.retainCount);
NSLog(@"str3 = %@ , %p , %lu",str3,str3,str3.retainCount);
NSLog(@"str4 = %@ , %p , %lu",str4,str4,str4.retainCount);
NSLog(@"str5 = %@ , %p , %lu",str5,str5,str4.retainCount);
NSLog(@"str6 = %@ , %p , %lu",str6,str6,str5.retainCount);
// 打印
2016-01-21 21:26:36.979 NSString内存管理问题[3269:255674] str1 = abc , 0x100004230 , 18446744073709551615
2016-01-21 21:26:36.980 NSString内存管理问题[3269:255674] str2 = aaa , 0x61616135 , 18446744073709551615
2016-01-21 21:26:36.981 NSString内存管理问题[3269:255674] str3 = abc , 0x100004230 , 18446744073709551615
2016-01-21 21:26:36.981 NSString内存管理问题[3269:255674] str4 = aaa , 0x61616135 , 18446744073709551615
2016-01-21 21:26:36.981 NSString内存管理问题[3269:255674] str5 = abc , 0x100004230 , 18446744073709551615
2016-01-21 21:26:36.981 NSString内存管理问题[3269:255674] str6 = , 0x7fff7c51bd00 , 18446744073709551615
// 然后说在IOS项目下又不一样,我姑且又试了一试,确实是内存地址不一样了,但是引用计数是什么鬼
2016-01-21 21:30:42.632 NSString内存管理[3289:257683] str1 = abc , 0x106f4c050 , 18446744073709551615
2016-01-21 21:30:42.633 NSString内存管理[3289:257683] str2 = aaa , 0xa000000006161613 , 18446744073709551615
2016-01-21 21:30:42.633 NSString内存管理[3289:257683] str3 = abc , 0x106f4c050 , 18446744073709551615
2016-01-21 21:30:42.633 NSString内存管理[3289:257683] str4 = aaa , 0xa000000006161613 , 18446744073709551615
2016-01-21 21:30:42.633 NSString内存管理[3289:257683] str5 = abc , 0x106f4c050 , 18446744073709551615
2016-01-21 21:30:42.633 NSString内存管理[3289:257683] str6 = , 0x107279380 , 18446744073709551615
// 最后,我不死心,又试了一下
NSArray *array1 = [[NSArray alloc] init];
NSLog(@"array1 = %lu",array1.retainCount);
NSMutableArray *array2 = [[NSMutableArray alloc] init];
NSLog(@"array2 = %lu",array2.retainCount);
// 打印
2016-01-21 21:48:01.828 NSString内存管理问题[3447:267148] array1 = 2 // 妈蛋 为什么是2
2016-01-21 21:48:01.828 NSString内存管理问题[3447:267148] array2 = 1
// 最后
看到最后,有这么一张图
总结一下吧,不要相信retainCount的值。(不要用它去做判断)
平常都在用ARC,也没注意到有这些问题,既然看到了,就权当了解一下。
标签:
原文地址:http://www.cnblogs.com/silence-wzx/p/5148924.html