了解Objective-C中NSAutoreleasePool使用方法
本文的目的是來(lái)了解Objective-C中NSAutoreleasePool使用方法,Objective-C的Foundation庫(kù)實(shí)際上是種運(yùn)行級(jí)對(duì)象系統(tǒng),與一般的對(duì)象語(yǔ)言,例如C++,Java不一樣,而與COM或者Corba一樣,對(duì)象,不一定創(chuàng)建在用戶應(yīng)用程序的地址空間中,有可能是創(chuàng)建在另一個(gè)地址空間中,甚至創(chuàng)建在別的機(jī)器上!
所以,Objective-C的對(duì)象(全部繼承自NSObject),就是使用引用計(jì)數(shù)的方法來(lái)管理對(duì)象的存活,眾所周知,當(dāng)引用計(jì)數(shù)為0時(shí),對(duì)象就被銷毀了。操作非常簡(jiǎn)單,當(dāng)對(duì)象被創(chuàng)建時(shí),引用計(jì)數(shù)被設(shè)成1??梢越o對(duì)象發(fā)送retain消息,讓對(duì)象對(duì)自己的引用計(jì)數(shù)加1。
而當(dāng)對(duì)象接受到release消息時(shí),對(duì)象就會(huì)對(duì)自己的引用計(jì)數(shù)進(jìn)行減1,當(dāng)引用計(jì)數(shù)到了0,對(duì)象就會(huì)呼叫自己的dealloc處理,一切都需要程序員親力親為,一點(diǎn)馬虎不得。
可是,NSAutoreleasePool是什么?它實(shí)際上是個(gè)對(duì)象引用計(jì)數(shù)自動(dòng)處理器。
首先,NSAutoreleasePool可以同時(shí)有多個(gè),它的組織是個(gè)棧,總是存在一個(gè)棧頂pool,也就是當(dāng)前pool,每創(chuàng)建一個(gè)pool,就往棧里壓一個(gè),改變當(dāng)前pool為新建的pool,然后,每次給pool發(fā)送drain消息,就彈出棧頂?shù)膒ool,改當(dāng)前pool為棧里的下一個(gè)pool。
接下來(lái)要注意,對(duì)象,并不是自動(dòng)被加入到當(dāng)前pool中,而是需要對(duì)對(duì)象發(fā)送autorelease消息,這樣,對(duì)象就被加到當(dāng)前pool的管理里了。
當(dāng)當(dāng)前pool接受到drain消息時(shí),它就簡(jiǎn)單的對(duì)它所管理的所有對(duì)象發(fā)送release消息。
到了這里,一定會(huì)發(fā)現(xiàn)這個(gè)所謂的pool有個(gè)坑人的特性,即,如果pool中被管理的對(duì)象接受到pool發(fā)送的那個(gè)release消息后,它的引用計(jì)數(shù)大于0,那么pool雖然消失了,但是那個(gè)對(duì)象還是存在的!
小結(jié):了解Objective-C中NSAutoreleasePool的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!