對(duì)象與內(nèi)存
15.1指針和指針的值
對(duì)象只能通過(guò)指針訪問(wèn),所以人們常用指向?qū)ο蟮闹羔榿?lái)稱呼該對(duì)象,例如有時(shí)候說(shuō)“now是一個(gè)NSDate實(shí)例”。然而,一定要記住指針和它指向的對(duì)象是不同的,準(zhǔn)確的說(shuō)法應(yīng)該是“now是一個(gè)指針變量,它保存了NSDate實(shí)例砸死內(nèi)存中的地址”。
NSDate *currentTime =nil;
NSLog(@"currentTime's value is %p",currentTime);
初始指針為nil,currentTime指向0x0
NSDate *currentTime =[NSDate date];
NSLog(@"currentTime's value is %p",currentTime);
sleep(2);
currentTime =[NSDate date];
NSLog(@"currentTime's value is %p",currentTime);
現(xiàn)在currentTime指向了另一個(gè)實(shí)例,第一個(gè)NSDate實(shí)例我們已經(jīng)丟失了,盡管它還在堆上。
如果要改變currentTime的值,但仍然希望訪問(wèn)第一個(gè)NSDate實(shí)例,就需要聲明一個(gè)指針來(lái)存儲(chǔ)第一個(gè)NSDate實(shí)例的地址。
NSDate *currentTime =[NSDate date];
NSLog(@"currentTime's value is %p",currentTime);
NSDate *startTime = currentTime;
sleep(2);
currentTime =[NSDate date];
NSLog(@"currentTime's value is %p",currentTime);
NSLog(@"the original object is %p",startTime);
15.2內(nèi)存管理
棧是由有序的幀構(gòu)成的。函數(shù)的幀會(huì)在函數(shù)結(jié)束后會(huì)自動(dòng)釋放,而堆里的對(duì)象不會(huì)自動(dòng)釋放。
管理堆很重要,因?yàn)槌绦蛘加玫亩汛笮∈怯邢薜?,而每個(gè)對(duì)象被創(chuàng)建后都會(huì)占用一定的堆內(nèi)存。
沒有指針指向第一個(gè)NSDate實(shí)例,從內(nèi)存管理的角度來(lái)看,這個(gè)對(duì)象已經(jīng)沒用了。但是它占用了寶貴的堆內(nèi)存,所以需要銷毀
15.3ARC
自動(dòng)銷毀不被引用的對(duì)象的機(jī)制稱為ARC。ARC是自動(dòng)引用計(jì)數(shù)的簡(jiǎn)稱,引用是指針的另外一種叫法。每個(gè)對(duì)象都會(huì)對(duì)自己的指針計(jì)數(shù)
當(dāng)引用數(shù)為0的時(shí)候,就會(huì)認(rèn)為不需要該對(duì)象了,程序會(huì)自動(dòng)銷毀該對(duì)象。如果項(xiàng)目開啟了ARC,編譯器會(huì)自動(dòng)給項(xiàng)目添加代碼來(lái)計(jì)數(shù)每個(gè)對(duì)象的引用計(jì)數(shù)
使用ARC,只能通過(guò)增加或減少對(duì)象的引用數(shù)來(lái)保留或者銷毀對(duì)象,而只用當(dāng)引用數(shù)為0時(shí),他才回被銷毀。
如果不再需要某個(gè)對(duì)象,則可以將指向它的指針設(shè)置為nil,活著銷毀它的指針。來(lái)銷毀對(duì)象。