// 先開啓殭屍對象檢測 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 (向一個已經被釋放的實例對象發送了消息)
// 最近在網上視頻上看到的一個有趣的問題,按照視頻上所講 // 字符串有一個常量池 // 若是你須要的字符串在常量池中已經存在了,不會分配內存空間 // 使用字符串的時候:採用下面一、三、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 , 18446744073709551615atom
2016-01-21 21:26:36.981 NSString內存管理問題[3269:255674] str6 = , 0x7fff7c51bd00 , 18446744073709551615spa
// 而後說在IOS項目下又不同,我姑且又試了一試,確實是內存地址不同了,可是引用計數是什麼鬼線程
2016-01-21 21:30:42.632 NSString內存管理[3289:257683] str1 = abc , 0x106f4c050 , 184467440737095516153d
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 , 18446744073709551615code
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,也沒注意到有這些問題,既然看到了,就權當了解一下。