成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

了解Cocoa中內(nèi)存如何管理

移動開發(fā) iOS
本文介紹的是了解Cocoa中內(nèi)存如何管理,隨著iPhone的更新?lián)Q代,它的CPU會越來越強大,它的內(nèi)存會越來越多,來看詳細內(nèi)容。

了解Cocoa內(nèi)存如何管理是本文要介紹的內(nèi)容,不多說,直接進入話題。今天我們來談?wù)?strong>Cocoa中關(guān)于內(nèi)存管理的問題。這個問題無論是對于桌面開發(fā)還是移動開發(fā)都非常重要。

尤其是對iPhone開發(fā)來說,更尤為重要。為什么說更呢?因為iPhone是移動終端,它不會象Mac一樣有很強的CPU,更不會有很多的內(nèi)存,這就使iphone程序在內(nèi)存開銷上變得非常昂貴。所以,如果我們不加限制的話,我們的開發(fā)的程序很可能會使用掉所有的內(nèi)存,這樣我們就沒有空閑的內(nèi)存來運行其他的程序了,誰都不想在運行程序的時候接不了電話,對吧。所以,在這里,我們要強掉內(nèi)存管理的重要性。

當(dāng)然,隨著iPhone的更新?lián)Q代,它的CPU會越來越強大,它的內(nèi)存會越來越多,即使是這樣我們也要養(yǎng)成良好的編程習(xí)慣,隨時考慮內(nèi)存問題,開發(fā)出沒有內(nèi)存泄露的完美的程序。

今天,我們將從兩方面討論內(nèi)存這個問題。

1、如何創(chuàng)建對象并向它分配內(nèi)存?

2、如何釋放對象占用的內(nèi)存?

一、如何分配內(nèi)存

我們使用alloc和init方法來創(chuàng)建對象并初始化對象,這其中就包含了向?qū)ο蠓峙鋬?nèi)存。我們看一下下面的代碼。

  1. Fraction *myFract = [[ Fraction alloc ]  init]; 

其中Fracion是一個類,上面語句創(chuàng)建了Fraction類的一個新對象myFract,并給它分配了內(nèi)存空間用來存儲在它當(dāng)中的變量。這是一個很簡單的語句,在你想給任何一個類創(chuàng)建新的對象時,你都可使用這條語句。

還有很多其他的方法可以用來獲得對象,就像前面做的一樣,下面是一些例子。

  1. NSString *newDisplay = [display.text  stringByAppendingString:digit];   
  2. NSArray *keys = [dictionary allKeys];   
  3. NSString *lowerString = [string lowercaseString];   
  4. NSNumber *n = [NSNumber numberWithFloat:42.0];  
  5. NSDate *date = [NSDate date];  

上面的這些方法都會獲得對象,還有很多類似的方法,現(xiàn)在,關(guān)鍵問題出來了,我們給這些對象分配了內(nèi)存,那誰負責(zé)釋放他們呢?我們來看看下面的東西。

二 、內(nèi)存的釋放

好了,我們接著上面留下的問題,為了解決這個問題,我要介紹下面幾個概念。

a、引用計數(shù)器(Reference Counting)

b、引用所有權(quán)(Ownership)

c、自動釋放池(Autoreleasepool)

引用計數(shù)器

我們在談?wù)搶ο髢?nèi)存的釋放,可到底什么時候我們需要釋放對象呢?判斷對象是否需要釋放的唯一標(biāo)準是:對象不再被使用,它在程序中沒有了利用的價值。我們就是使用引用計數(shù)器來判斷對象在程序中是否還在被使用。

引用計數(shù)器就是用來跟蹤對象的引用次數(shù),它是這樣工作的:當(dāng)一個對象被創(chuàng)建時,將它的引用次數(shù)設(shè)置為1,每當(dāng)程序中的其他對象或方法調(diào)用它時,它的計數(shù)器就加1。當(dāng)調(diào)用結(jié)束時,計數(shù)器就減1,這就意味著這個方法對對象的使用結(jié)束了。當(dāng)一個對象的計數(shù)器為0的時候,表示這個對象不被程序中任何其他的對象和方法調(diào)用,也就是程序不再需要它,這時候我們就可以安全的釋放它了。

這里面有兩個非常重要的方法,一個是retain(保持),另一個是release(釋放)。當(dāng)對象被引用時,我們向?qū)ο蟀l(fā)送retain方法,使它的計數(shù)器加1.當(dāng)引用結(jié)束后,我們向他發(fā)送release方法,使它的計數(shù)器減1.這樣看來,retain和release方法是成對出現(xiàn)的,每一個retain對應(yīng)一個release,同理,我們還會有一個release方法和計數(shù)器的初始值1相對應(yīng),這樣才能保證計數(shù)器可以減到0,確保對象可以被釋放。

所有權(quán)(Ownership)

你可能對上面的介紹感到有些抽象,難于理解。下面我們介紹所有權(quán)的概念,它會有助于你對計數(shù)器的理解。在計數(shù)器的介紹中我們說一個對象被一個對象所引用,例如對象myFract被對象myNumbe所引用,我們就說myNumbe對Fract有所有權(quán)。對應(yīng)的,當(dāng)myNumbe不再使用Fract時,它就要放棄對Fract的所有權(quán)。當(dāng)程序中沒有對象和方法對Fract有所有權(quán)時,對象Fract就可以被釋放了。這里還要強調(diào)一點,一個對象可以被多個對象或方法所擁有,也就是說程序中可以有多個對象或方法同時對同一個對象擁有所有權(quán)。

好了,接下來我們把計數(shù)器和所有權(quán)聯(lián)系在一起。

當(dāng)對象A被對象B(或方法)調(diào)用時,對象B向A發(fā)送retain消息來獲得對A的所有權(quán),于此同時A的計數(shù)器加1;

當(dāng)B對A的調(diào)用結(jié)束后,對象B向A發(fā)送release消息來放棄對A的所有權(quán),與此同時A的計時器減1;

當(dāng)A的計數(shù)器為0時,也就是程序中不再有人對A有所有權(quán),這時,A就可以被安全的釋放。

現(xiàn)在明白了么?

自動釋放池

我們來說最后一個概念,我們要把這個問題和前兩個概念聯(lián)系在一起,因為它們都是Cocoa內(nèi)存管理的組成部分。我們來談自動釋放池。

系統(tǒng)使用自動釋放池來跟蹤對象,以便以后釋放它們。有些對象在你使用完之后,你并不確定你是否還會再次使用到它,如果這時候就釋放了,以后在用到它的時候就會很麻煩。自動釋放池可以解決這個問題。因為你可以通過標(biāo)記把對象添加到自動釋放池中,在自動釋放池被釋放的時候,它所包含的對象也會被一起釋放。當(dāng)對象被添加到釋放池中后,它并沒有被釋放,所以你還可以使用它,但你也不用擔(dān)心自己忘記釋放它,應(yīng)為你已經(jīng)把它添加到釋放池中了。

下面這條語句用來建立釋放池:

  1. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

這條語句用來釋放自動釋放池:

  1. [pool drain]; 

要把對象添加到自動釋放池中,可以使用下面的語句:

  1. [ myFract autorelease] ; 

有一點要注意,把對象添加到釋放池并不會使對象的計數(shù)器加1.

三、內(nèi)存管理規(guī)則摘要

a釋放對象,可以釋放它所占有的內(nèi)存,如果你的程序在運行時創(chuàng)建了很多對象,應(yīng)該關(guān)注對象的釋放,良好的規(guī)則是,不再使用創(chuàng)建或保持的對象時,就釋放它們。

b發(fā)送一條release消息不一定銷毀對象,當(dāng)一個對象的引用計數(shù)器為0時,才銷毀這個對象。系統(tǒng)通過向該對象發(fā)送一條dealloc消息來釋放它所占的內(nèi)存。

c自動釋放池用于在釋放本身時自動釋放池中的對象。

d如果你的方法中不再需要一個對象,但需要返回它時,那么向其發(fā)送一條autorelease消息,將它標(biāo)記為以后釋放。

e如果使用alloc和copy方法直接創(chuàng)建對象,則由你負責(zé)釋放它。每次retain對象,應(yīng)該release或autorelease它。

小結(jié):了解Cocoa內(nèi)存如何管理的內(nèi)容介紹完了,以上這些是Cocoa內(nèi)存管理的基本概念,也是最為重要的概念。對內(nèi)存管理的關(guān)注要貫穿程序開發(fā)的始終,我們要一再的強調(diào)它的重要性。最后希望本文對你有所幫助!

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-07-07 09:54:01

Cocoa Core Foundation

2018-03-01 16:25:52

Linux內(nèi)核內(nèi)存管理

2011-08-15 16:28:06

Cocoa內(nèi)存管理

2011-07-26 15:14:24

蘋果 Cocoa 內(nèi)存

2011-07-28 10:40:40

Cocoa KVO

2011-07-18 15:08:34

2011-08-15 14:27:51

CocoaRunLoop

2011-07-28 17:46:54

IOS Cocoa 用戶界面

2011-08-08 09:51:52

Cocoa 框架

2011-08-10 18:13:01

Cocoa文字字符串

2019-07-03 10:29:59

JavaScript算法程序員

2011-08-04 13:55:10

Cocoa Objective- 文件

2011-08-01 11:37:41

iPhone Objective- 內(nèi)存

2011-07-28 15:35:59

IOS 程序 內(nèi)存

2023-10-26 11:19:21

指針Go

2011-08-11 15:46:55

CocoaCocoa Touch框架

2011-07-20 14:41:53

Cocoa Zip 框架

2024-04-10 13:59:44

JavaScript內(nèi)存

2018-12-19 08:00:24

Terraform開源

2011-08-10 18:37:32

CocoaMac OS X
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久99久久99久久 | 一区二区在线 | 亚洲电影中文字幕 | 羞羞视频在线网站观看 | 久久久亚洲一区 | 91精品国产综合久久精品 | 国产在线观看不卡一区二区三区 | 一区二区三区四区在线视频 | 精品久久久久久久久久久久久 | 天天艹日日干 | 第四色播日韩第一页 | 日韩成人在线网站 | 日韩视频区 | 伊人免费在线观看高清 | 在线成人| 亚洲成人一区二区 | 国产精品毛片一区二区三区 | 爱爱综合网 | 日韩精品一区二区三区视频播放 | 一区二区三区中文字幕 | 美女黄网 | 五月婷婷丁香婷婷 | 欧美中文在线 | 欧美一级黄色网 | 国产精品久久久久久妇女 | 欧美影院久久 | 成人在线视频看看 | 91精品久久久 | 天天插天天射天天干 | 91视频中文 | 久久久网 | 免费99视频 | 宅女噜噜66国产精品观看免费 | 亚洲第一色av| 国产精品7777777 | 欧美一二区 | 亚洲成年影院 | 黄色免费在线观看 | 久久国产免费 | jvid精品资源在线观看 | 精品少妇一区二区三区在线播放 |