最近要開(kāi)始準(zhǔn)備找實(shí)習(xí)單位了,做做筆試題,看看各位大神的面試經(jīng)歷,發(fā)現(xiàn)自己要學(xué)習(xí)的東西真的還有很多,雖然也做過(guò)幾個(gè)的項(xiàng)目,但是真正拿過(guò)筆試題一看,才發(fā)現(xiàn)自己對(duì)基礎(chǔ)這方面的東西,確實(shí)有點(diǎn)忽視了,所以最近開(kāi)啟惡補(bǔ)模式。
這幾天在研究ios內(nèi)存分析這一塊,才發(fā)現(xiàn)自己原來(lái)忽視了這么多重要的東西,在這里和大家分享一下。
先來(lái)看一段代碼:
NSString* s;
s = [[NSString alloc] initWithString:@"hello ios"];
這是一段最簡(jiǎn)單的字符串定義,但是看似簡(jiǎn)單,其實(shí)有很多東西可能會(huì)被忽略掉
1.這里的s其實(shí)是個(gè)指針,在oc中除了基本數(shù)據(jù)類(lèi)型之外的變量類(lèi)型都是指針類(lèi)型,oc的對(duì)象也是通過(guò)指針進(jìn)行操作的。
2. 在第一段代碼定義了NSString類(lèi)型的指針變量,但是并沒(méi)有指向任何對(duì)象,第二段代碼alloc一個(gè)NSString對(duì)象 然后使s指向它,并通過(guò)s開(kāi)始其的后續(xù)操作。
3. 這里s的內(nèi)存空間在棧內(nèi)存中,“hello ios”在堆內(nèi)存中。
下面通過(guò)圖示說(shuō)明一下

再來(lái)看一個(gè)例子
@interface C: NSObject{ int a; int b; }@endint main(int argc, const char *argv[]){ C *c1 = [[C alloc]init]; C *c2 = [[C alloc]init]; }
內(nèi)存分布情況

看到這里大家也就能明白了,oc中創(chuàng)建的對(duì)象指針存儲(chǔ)在棧內(nèi)存中,而alloc出來(lái)的對(duì)象的內(nèi)存在堆內(nèi)存中,棧內(nèi)存中的指針通過(guò)賦值指向堆內(nèi)存中的對(duì)象,然后通過(guò)棧內(nèi)存中的指針訪問(wèn)對(duì)象及其變量,也就是說(shuō),其實(shí)我們?cè)趧?chuàng)建一個(gè)對(duì)象時(shí)其實(shí)是利用了兩個(gè)部分的內(nèi)存空間。
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注