現在的位置: 首頁 > 綜合 > 正文

Objective-C中NSString對象retainCount之謎探索

2013年11月26日 ⁄ 綜合 ⁄ 共 1271字 ⁄ 字型大小 評論關閉

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

抱歉!評論已關閉.