NSString的內存分配及管理


本文參考了這篇文章,主要做了補充說明:http://www.cnblogs.com/hellocby/archive/2012/08/23/2652201.html

生成一個NSString類型的字符串有三種方法:

方法1.直接賦值:    NSString *testStr1 = @"a";

方法2.類函數初始化生成:     

    NSString *testStr2 = [NSString stringWithString:@"b"];

    NSString *testStr3 = [NSString stringWithFormat:@"c"];

 方法3.實例方法初始化生成: 

    NSString *testStr4 = [[NSString alloc] initWithString:@"d"];

    NSString *testStr5 = [[NSString alloc] initWithFormat:@"e"];

首先查看它們的地址和引用計數:

2012-10-11 17:35:25.601 StringDemo[8514:11303] test1Address:0x4698

2012-10-11 17:35:25.601 StringDemo[8514:11303] test2Address:0x46a8

2012-10-11 17:35:25.602 StringDemo[8514:11303] test3Address:0x746c820

2012-10-11 17:35:25.602 StringDemo[8514:11303] test4Address:0x46c8

2012-10-11 17:35:25.603 StringDemo[8514:11303] test5Address:0x7455990

 

2012-10-11 17:35:25.585 StringDemo[8514:11303] test1:4294967295

2012-10-11 17:35:25.586 StringDemo[8514:11303] test2:4294967295

2012-10-11 17:35:25.596 StringDemo[8514:11303] test3:1

2012-10-11 17:35:25.600 StringDemo[8514:11303] test4:4294967295

2012-10-11 17:35:25.600 StringDemo[8514:11303] test5:1

 

從上可以看出,test1,test2,test4都是在一個內存區域,也就是上文所說的常量內存區。test3,test5在一個內存區,也就是堆區。

這里就有一個疑問:[NSString alloc] initWithString:@"d"這種方式初始化的字符串,也就是test4.應該是位於堆區的,但為什么會跑到常量內存區來呢?據說是因為xcode對這種方式做了處理,還包括[NSString stringWithString:@"b"]這種方式,這兩種初始化字符串都等同於@"ddd"了。所以說test2,test4都同等於test1了。

還有,對於NSString *testStr3 = [NSString stringWithFormat:@"c"];這種初始化的字符串,只要一寫release語句就會掛掉,但其它的都不會掛掉,test1,test2,test4好理解,因為release本來就不會起作用;但testStr5無論release多少次也不會掛掉,只會在控制台報警告:malloc: *** error for object 0x744d650: double free*** set a breakpoint in malloc_error_break to debug。這個猜測應該是也xcode做了優化吧。

對現在4.4之后的編譯器,NSString *testStr2 = [NSString stringWithString:@"b"];這種寫法會報警告了:Using 'stringWithString' with a literal is redundant。也就是說這種寫法是多余的了,它給的建議是用=@"b"這種方式來代替了。

小結下吧:

對NSString的初始化方法,對於test1,test2,test4這三種的話建議用=@“字符串”來使用,因為本來就是一樣的。test3,test5這兩種的話,建議用texst3這種,方便點,不用管內存問題,系統自已管理。

 

有錯誤的地方歡迎指出。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM