關於 NSString 的引用計數問題

2021-07-07 04:50:59 字數 2026 閱讀 7874

nsstring *str1 = @"aaa";

nslog(@"%lu---%p",(unsignedlong)[str1 retaincount],str1);

nsstring *str2 = [[nsstringalloc]initwithstring:@"aaa"];

nslog(@"%lu---%p",(unsignedlong)[str2 retaincount],str2);

nsstring *str3 = [[nsstringalloc]initwithformat:@"aaa"];

nslog(@"%lu---%p",(unsignedlong)[str3 retaincount],str3);

nsstring *str4 = [[nsstringalloc]initwithformat:@"a%s","aa"];

nslog(@"%lu---%p",(unsignedlong)[str4 retaincount],str4);

nsstring *str5 = [nsstringstringwithformat:@"aaa"];

nslog(@"%lu---%p",(unsignedlong)[str5 retaincount],str5);

nsstring *str6 = [[nsstringalloc]initwithformat:@"啊啊啊"];

nslog(@"%lu---%p",(unsignedlong)[str6 retaincount],str6);

nsstring *str7 = [[nsstringalloc]initwithformat:@"⊙▽⊙"];

nslog(@"%lu---%p",(unsignedlong)[str7 retaincount],str7);

列印資訊:

2015-11-14 00:46:23.955 nsstring[2252:107204] 18446744073709551615---0x1082f1050

2015-11-14 00:46:23.956 nsstring[2252:107204] 18446744073709551615---0x1082f1050

2015-11-14 00:46:23.956 nsstring[2252:107204] 18446744073709551615---0xa000000006161613

2015-11-14 00:46:23.957 nsstring[2252:107204] 18446744073709551615---0xa000000006161613

2015-11-14 00:46:23.957 nsstring[2252:107204] 18446744073709551615---0xa000000006161613

2015-11-14 00:46:23.957 nsstring[2252:107204] 1---0x7fa68a6186a0

2015-11-14 00:46:23.957 nsstring[2252:107204] 1---0x7fa68a618e30

1.首先我們可以看到通過 nsstring 的手動引用的計數發現是乙個非常巨大的數字,這也反映出平時所用的計數方法對於字串並不適用,並且通過 retain 和 release 方法也不會改變其計數

2.其次通過列印的字串物件的位址,我們也可以發現,並不是每次都會建立出乙個新的物件,通過相同方法建立出來的相同內容的字串物件位址相同,也就說明他們其實是同乙個物件

因此,這也說明,字串在 oc 中系統對其有特殊的處理方式,當字串建立出來時會放到乙個固定的**塊,如果之後建立出來的字串物件內容是相同的,會將後建立的字串也指向那個字串

不過對於中文字元和特殊字元建立的字串則計數會變為1,且 retain 和 release 方法可使用,原因尚未得知

NSString的有意思的引用計數

當我們用alloc 初始化乙個物件的時候,這個物件的引用計數為1 當你不需要它的時候release 來釋放它 nsstring str nsstring alloc initwithstring abc str 123 str release nslog str 首先,咱們先對這段 進行分析。第一句...

關於block和引用計數

1 修飾block 如果需要block在它被宣告的作用域被銷毀後繼續使用的話,你就需要做乙份拷貝。拷貝會把block移到堆裡面。所以,使用 property時設定通常如下 property copy,nonatomic void block void 2 retain cycle的問題 block在...

自動引用計數

每當你產生乙個物件,arc分配一大塊控制項去儲存這個物件。除此之外,當乙個物件是不在需要,arc 將會收回這個例項物件所佔的空間。如果乙個物件的空間被釋放掉,但是你任然通過物件的引用呼叫方法或者屬性,你的程式將要崩潰。為了不讓物件被釋放掉 arc將會追蹤有多少屬性 常量 變數正在引用這個物件。只要有...