Objective-C對於NSString字元串,會採用不同的實現形式,鄙人經過總結得出一下結論:(可能有誤,則其善者而從之)
1. 字元串常量,類似於C語言形式,靜態區存儲
NSString *s = @"test";
NSLog(@"s:%lx",[s retainCount]);//輸出值為0xffffffffffffffff(UINT_MAX)
NSLog(@"s:%ld",[s retainCount]);//輸出值-1,由於0xffffffffffffffff補碼錶示的值為-1
因為"test"為字元串常量,系統不會採用計數方式回收,所以不會對其作引用計數,即使我們對s如何retain或release,其值保持不變,對象也保持不變。
2. stringWithFormat
NSString *s = [NSString stringWithFormat:@"%s", "test"];
NSLog(@"s:%d",[s retainCount]); //輸出值為1
使用stringWithFormat創建的NSString為變數,系統會進行引用計數,和普通對象一樣。
3. stringWithString
stringWithString這個方法比較特別:分兩種情況,它的retainCount取決於它後面跟的string對象
情況1:NSString *s1 = [NSString stringWithString:@"test"];
NSLog(@"s1:%d",[s1 retainCount]); // 2147483647
情況2:NSString *s2 = [NSString stringWithString:[NSString stringWithFormat:@"test,%d",1]];
NSLog(@"s2:%d",[s2 retainCount]); // 2
可以看到情況1為"常量"對象,其retainCount方法的實現返回的是maxIntValue。
情況2輸出值為2,也證明了前面說的,這個方法生成的只是一個對另一個對象的引用。一個對象實例,一次stringWithFormat (+1)和stringWithString(+1),它的retainCount為2,同時都被當前的AutoreleasePool管理。
4.NSMutableString
NSMutableString* myStr3 = [NSMutableStringstringWithString:@"string 3"];
輸出1,有引用計數
本文部分內容引用自http://www.cnblogs.com/hibernate6/archive/2012/04/26/2521879.html
2013-7-13於Mac Firefox