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

iphone內(nèi)存管理詳解

移動(dòng)開發(fā) iOS
開發(fā)iPhone 應(yīng)用程序并不難,基本上就是三個(gè)詞 – “memory, memory, memory” 。iPhone OS 對內(nèi)存的要求很嚴(yán)格,有memory leak ,殺掉; 內(nèi)存使用超限額,殺掉。一個(gè)經(jīng)過測試的程序,在使用程中90%以上的崩潰都是內(nèi)存問題造成的。在這里簡單總結(jié)一下Object-C 內(nèi)存管理。

iPhone開發(fā)中,對內(nèi)存進(jìn)行正確的管理是非常重要的一個(gè)方面。iPhone有128MRAM,但其中約有一半的容量要用于屏幕緩沖和其他系統(tǒng)進(jìn)程,同時(shí)iPhone不支持將內(nèi)存寫到交換文件,所以iPhone只有大約64M的內(nèi)存用來運(yùn)行應(yīng)用程序,且嚴(yán)格受到物理內(nèi)存量的限制。這樣,基本上不容許我們開發(fā)的軟件存在任何的內(nèi)存泄露。

由于iPhone對內(nèi)存嚴(yán)格的要求,所以當(dāng)一個(gè)對象不再需要時(shí),要及時(shí)釋放它所占用的內(nèi)存空間。

Objective-C 的內(nèi)存管理采用了基于引用計(jì)數(shù)(Reference Count)這種非常常用的技術(shù)。簡單講,每個(gè)對象都有一個(gè)與之關(guān)聯(lián)的整數(shù),可以將它稱為引用計(jì)數(shù)器或保留計(jì)數(shù)器,如果要使用一個(gè)對象,并確保在使用期間對象不被釋放,需要通過函數(shù)調(diào)用來取得“所有權(quán)”,即引用計(jì)數(shù)器加1,使用結(jié)束后再調(diào)用函數(shù)釋放“所有權(quán)”,使引用計(jì)數(shù)器減1。“所有權(quán)”的獲得和釋放,對應(yīng)引用計(jì)數(shù)的增加和減少。引用計(jì)數(shù)為正數(shù)時(shí)代表對象還有引用,為0時(shí)代表可以釋放。

copy 和 retain 的區(qū)別

copy: 建立一個(gè)索引計(jì)數(shù)為1的對象,然后釋放舊對象

retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計(jì)數(shù)為1。

那上邊是什么意思呢?

Copy其實(shí)是建立了一個(gè)相同的對象,而retain不是:

比如一個(gè)NSString對象,地址為0×1111,內(nèi)容為@”STR”

Copy到另外一個(gè)NSString之后,地址為0×2222,內(nèi)容相同,新的對象retain為1,舊有對象沒有變化

retain到另外一個(gè)NSString之后,地址相同(建立一個(gè)指針,指針拷貝),內(nèi)容當(dāng)然相同,這個(gè)對象的retain值+1

也就是說,retain是指針拷貝,copy是內(nèi)容拷貝。哇,比想象的簡單多了…

誤釋放對象

問題一:

  1. value = [array objectAtIndex:n]; //得到一個(gè)數(shù)組中的對象  
  2. [arry removeObjectAtIndex:n]; //卸載那個(gè)對象 

因?yàn)関alue得到了那個(gè)對象,但是由于另外一個(gè)擁有者release了該對象,所以其實(shí)value現(xiàn)在成了搖擺指針(無效數(shù)據(jù))

問題二:

  1. myArray = [NSArray array];   
  2. ....  
  3. [myArray release]; 

NSArray返回的是一個(gè)自動(dòng)釋放對象,不僅myArray不應(yīng)該在一段時(shí)間后release,而應(yīng)該在適當(dāng)?shù)臅r(shí)候先retain,以防止該array被系統(tǒng)誤釋放。

問題三:

  1. rocket = [rocketLauncher aRocket];  
  2. [rocketLauncher release]; 

和array這種數(shù)據(jù)收集類對象一樣,如果我們得到了一個(gè)類的子對象而不retain它,那么在原父類被釋放的時(shí)候,這個(gè)rocket其實(shí)也會(huì)失去其意義。

Cocoa不同內(nèi)存管理環(huán)境下的autorelease

H 混合內(nèi)存管理環(huán)境:垃圾收集法(Garbage Collection)+索引計(jì)數(shù)法(Reference Counting)

雖然大多數(shù)情況下混合環(huán)境是不被推薦的,但是如果在這個(gè)情況下,autorelease需要注意以下事項(xiàng):

垃圾收集混合環(huán)境下:應(yīng)該使用drain方法,因?yàn)閞elease在GC模式下沒有意義

索引計(jì)數(shù)環(huán)境下:drain和release對于autoreleasepool(自動(dòng)釋放池)的效果相同

對autorelease的誤解

A Cocoa的內(nèi)存管理分為 索引計(jì)數(shù)法(Reference Counting/ Retain Count)和 垃圾收集法(Garbage Collection)。而iPhone上目前只支持前者,所以autorelease就成為很多人的“捷徑”。

但是!autorelease其實(shí)并不是“自動(dòng)釋放”,不像垃圾收集法,對對象之間的關(guān)系偵測后發(fā)現(xiàn)垃圾-刪除。但是autorelease其實(shí)是“延后釋放”,在一個(gè)運(yùn)行周期后被標(biāo)記為autorelease會(huì)被釋放掉。

切記小心使用autorelease,理解autorelease,防止在你還需要該對象的時(shí)候已經(jīng)被系統(tǒng)釋放掉了。

Interface Builder參與的內(nèi)存管理問題

要點(diǎn):

如果一個(gè)變量在類中被定義為了 IBOutlet 那么你無需對其進(jìn)行實(shí)例化,xib載入器會(huì)對其初始化。

如果一個(gè)變量在類中被定義為了 IBOutlet 那么你必須負(fù)責(zé)將其釋放。xib載入器不會(huì)幫忙的… …

*切不要初始化兩回,內(nèi)存會(huì)溢出,而且對象鎖定也會(huì)出錯(cuò)。

關(guān)于索引計(jì)數(shù)(Reference Counting)的問題

*retain值 = 索引計(jì)數(shù)(Reference Counting)

NSArray對象會(huì)retain(retain值加一)任何數(shù)組中的對象。當(dāng)NSArray被卸載(dealloc)的時(shí)候,所有數(shù)組中的對象會(huì)被執(zhí)行一次釋放(retain值減一)。不僅僅是NSArray,任何收集類(Collection Classes)都執(zhí)行類似操作。例如NSDictionary,甚至UINavigationController。

Alloc/init建立的對象,索引計(jì)數(shù)為1。無需將其再次retain。

[NSArray array]和[NSDate date]等“方法”建立一個(gè)索引計(jì)數(shù)為1的對象,但是也是一個(gè)自動(dòng)釋放對象。所以是本地臨時(shí)對象,那么無所謂了。如果是打算在全Class中使用的變量(iVar),則必須retain它。

缺省的類方法返回值都被執(zhí)行了“自動(dòng)釋放”方法。(*如上中的NSArray)

在類中的卸載方法“dealloc”中,release所有未被平衡的NS對象。(*所有未被autorelease,而retain值為1的)

NSString的內(nèi)存管理

如下實(shí)例:

  1. aString = @"I am a string that 2 years old, man!"; 

這種情況下,字符串儲(chǔ)存和管理由系統(tǒng)做,我們不用操心。

  1. aString = [NSString stringWithFormat:@"I am a string that %d years old, man!",2]; 

第二種情況下,我們需要去retain和release這個(gè)字符串,系統(tǒng)不管。

Objective-C內(nèi)存管理

1,你初始化(alloc/init)的對象,你需要釋放(release)它。例如:

  1. NSMutableArray aArray = [[NSArray alloc] init]; 

后,需要

  1. [aArray release]; 

2,你retain或copy的,你需要釋放它。例如:

  1. [aArray retain] 

后,需要

  1. [aArray release]; 

3,被傳遞(assign)的對象,你需要斟酌的retain和release。例如:

  1. obj2 = [[obj1 someMethod] autorelease]; 

對象2接收對象1的一個(gè)自動(dòng)釋放的值,或傳遞一個(gè)基本數(shù)據(jù)類型(NSInteger,NSString)時(shí): 你或希望將對象2進(jìn)行retain,以防止它在被使用之前就被自動(dòng)釋放掉。但是在retain后,一定要在適當(dāng)?shù)臅r(shí)候進(jìn)行釋放。

為什么不能直接調(diào)用dealloc而是release

dealloc不等于C中的free,dealloc并不將內(nèi)存釋放,也不會(huì)將索引計(jì)數(shù)(Reference counting)降低。于是直接調(diào)用dealloc反而無法釋放內(nèi)存。

在Objective-C中,索引計(jì)數(shù)是起決定性作用的。

【編輯推薦】

Objective-C內(nèi)存管理基礎(chǔ)

Objective-C入門 簡介Cocoa框架

iOS開發(fā):Objective-C優(yōu)雅的語法

從零開始 iPhone應(yīng)用程序開發(fā)入門指南

iOS高效開發(fā)必備的10款Objective-C類庫

責(zé)任編輯:zhaolei 來源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2011-08-11 11:37:34

iPhone內(nèi)存

2017-04-01 14:01:50

Apache Spar內(nèi)存管理

2018-12-18 14:37:26

Spark內(nèi)存管理

2011-07-19 15:37:13

Oracle 10g內(nèi)存管理PGA

2019-05-30 11:04:52

內(nèi)存Spark管理

2011-08-19 14:14:14

iPhone應(yīng)用

2010-09-26 13:23:13

JVM內(nèi)存管理機(jī)制

2011-07-21 15:40:24

iPhone 內(nèi)存管理 對象

2011-07-01 10:16:08

C++內(nèi)存管理

2010-12-10 15:40:58

JVM內(nèi)存管理

2011-06-29 17:20:20

Qt 內(nèi)存 QOBJECT

2010-09-13 08:58:47

自動(dòng)釋放便捷方法內(nèi)存管理

2018-08-09 11:06:39

Apache Spar內(nèi)存模型

2020-08-18 19:15:44

Redis內(nèi)存管理

2011-07-27 15:47:09

iPhone Simulator 文件

2009-09-02 09:23:26

.NET內(nèi)存管理機(jī)制

2011-08-22 11:07:16

IOS 開發(fā)多核內(nèi)存

2011-08-10 17:37:00

iPhoneASIHTTPRequ

2011-08-12 14:58:43

iPhoneTableview數(shù)據(jù)

2011-08-02 16:28:40

iPhone Web開發(fā) 事件
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产乱肥老妇国产一区二 | 999免费观看视频 | 美女视频h | 日韩a| 黑色丝袜三级在线播放 | 成人一级毛片 | 日韩在线观看中文字幕 | 成人av一区二区在线观看 | 国产区精品 | h视频网站在线观看 | 日韩视频 中文字幕 | 天天看天天摸天天操 | 九九一级片 | 欧美日韩三区 | 日本精品一区二区三区视频 | 亚洲网视频| 亚洲免费在线观看 | 国产午夜在线观看 | 欧美性大战久久久久久久蜜臀 | 国产精品视频网 | 欧美中文一区 | 亚洲精选久久 | 国产日韩欧美一区二区 | 激情综合五月天 | 99精品久久久 | 国产午夜精品久久久久免费视高清 | 精品影院| 欧美一级小视频 | 日韩电影免费观看中文字幕 | 亚洲精品女优 | 99re热精品视频 | 国产一区久久久 | 日韩一二三区 | 欧美美女爱爱视频 | 爱爱视频在线观看 | 欧美精品1区2区 | 欧美一区二区久久 | 亚洲一区二区三区高清 | 一区二区av | 国产精品一区二区电影 | 黑人精品xxx一区一二区 |