OC中NSString對象retainCount之謎探索

1. 字符串常量,類似於C語言形式,靜態區存儲
  
  1. NSString *s = @"test";
  2.   NSLog(@"s:%lx",[s retainCount]);//輸出值爲0xffffffffffffffff(UINT_MAX)
  3.   NSLog(@"s:%ld",[s retainCount]);//輸出值-1,由於0xffffffffffffffff補碼錶示的值爲-1
複製代碼

  因爲"test"爲字符串常量,系統不會採用計數方式回收,所以不會對其作引用計數,即使我們對s如何retain或release,其值保持不變,對象也保持不變。

  2. stringWithFormat
  
  1. NSString *s = [NSString stringWithFormat:@"%s", "test"];
  2.   NSLog(@"s:%d",[s retainCount]); //輸出值爲1
複製代碼

  使用stringWithFormat創建的NSString爲變量,系統會進行引用計數,和普通對象一樣。

  3. stringWithString

  stringWithString這個方法比較特別:分兩種情況,它的retainCount取決於它後面跟的string對象
  
  1. 情況1:NSString *s1 = [NSString stringWithString:@"test"];
  2.   NSLog(@"s1:%d",[s1 retainCount]); // 2147483647
  3.   情況2:NSString *s2 = [NSString stringWithString:[NSString stringWithFormat:@"test,%d",1]];
  4.   NSLog(@"s2:%d",[s2 retainCount]); // 2
複製代碼

  可以看到情況1爲"常量"對象,其retainCount方法的實現返回的是maxIntValue。

  情況2輸出值爲2,也證明了前面說的,這個方法生成的只是一個對另一個對象的引用。 一個對象實例,一次stringWithFormat (+1)和stringWithString(+1),它的retainCount爲2,同時都被當前的AutoreleasePool管理。

  4.NSMutableString
  
  1. NSMutableString* myStr3 = [NSMutableString stringWithString:@"string 3"];
複製代碼

  輸出1,有引用計數
發佈了27 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章