內存管理

 真機下 app 使用不能超過30M,否則系統會向app發送 Memory Warning消息,收到消息後 app必須正確處理,否則可能出錯或者出現內存泄漏,甚至崩潰
        程序運行時的內存資源是有限的 Objective C語言所編寫的程序中需要實例化對象
對象是要佔用內存的 如果創建了對象(分配了內存)而不去釋放這些對象所佔用的內存,將會發生內存泄露
需要手機去管理內存
管理內存1.分配內存2.釋放內存
在不需要這個對象的時候及時見這個對象釋放掉,就可以防止內存泄露(光分配不釋放)
不知道怎麼去判斷是否要釋放一個對象 引用計數
引用計數:是判斷一個對象是否存在的標準
引用計數公式:對象名.retainCount
什麼樣的數據需要手動管理內存
基本數據類型(不能稱爲對象,因爲他只是一個單一的數據)不用手動管理內存 —系統會處理 —棧
除了基本數據類型 都需要手動管理內存(需要程序員管理)—堆
int a = 10;//棧 不需要管理內存
Person *p = [[Person alloc]init];//堆 需要管理內存 
程序員開闢的內存 屬於分配到 堆裏
系統自動分配的內存 回到棧裏
內存管理的原則:誰分配 誰釋放
retainCount 引用計數大於0的時候 就是對象存在的時候  如果不大於0就表示這個對象已經被釋放了

生命週期
1.alloc 創建之後 對象就存在了
2.具體對象的操作
3.釋放對象
生命週期:創建 操作 釋放

引用計數
引用計數的操作:引用計數是判斷一個對象 是否存在的標準(大於0)
讓引用計數+1的方法:
1.alloc new
2.retain  保留引用計數
3.copy 拷貝
讓引用計數-1的方法:
1.release 釋放
2.autorelease 延遲釋放
對象被釋放的時候 會帶調用一個銷燬對象的方法   dealloc —銷燬對象
有一個alloc retain copy就要有一個對應的release 才能釋放掉對象
setter方法的內存管理
- (void)dealloc{
[super dealloc];
[原來的變量(全局變量)retain];
}

-(void)set對象名:(類名)參數名{
if(原來變量!=參數名){
  [原來變量 release];
原來的變量 = [參數名 retain];
   }
}

內存管理的原則:誰分配誰釋放
有一個alloc retain copy就要有對應的release autorelease
dealloc—>銷燬對象  只要調用了dealloc就標誌着這個對象被銷燬了
引用計數:對象名.retainCount
應用計數+1:alloc retain copy
引用計數-1:release autorelease

copy :會產生一個新的對象 新的對象引用計數+1
retain:保留 引用計數  給原來的引用計數+1 只要有一個引用計數爲0 這個對象就會被銷燬(操作的是同一個對象)
copy會產生一個新的對象給新的對象+1(跟原來的沒關係)如果是釋放了原來的對象新的對象依然存在
autorelease:延遲釋放 等到需要釋放的時候 纔會釋放 引用計數也會-1
autorelease常與自動釋放池配合使用
自動釋放池:在自動釋放池裏面的對象,只要使用了autorelease在出池的時候就會同意釋放掉

自動釋放池有兩種寫法
1.@autoreleasepool{
花括號內表示自動釋放池內
} 出了花括號就表示出池(所有使用autorelease的對象全部會被釋放掉)
2.NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
只要在自動釋放池release之前都算池內
[pool release];所有使用autorelease的對象全部會被釋放掉
屬性的ARC關鍵字的聲明
ARC:自動管理引用計數
屬性手動管理引用計數
MRC:手動管理引用計數
RAC:1.string強壯的不會被釋放調用(告訴系統這個屬性是不能被釋放的)
          2.unsafe_unretained允許在特殊情況下釋放掉  不安全的

在定義字符串、數組、字典的時候一般使用copy
定義基本數據類型使用assign (assign:直接賦值)
其他對象都是用retain

屬性其他關鍵字
1.只讀:readonly 只允許只允許訪問不允許修改(值允許使用getter的方法)
2.readwrite
3.getter = isSuccess 表示在賦值的時候這個屬性叫做success在取值的時候叫做isSuccess

1.retain:只要使用屬性除了基本數據類型 都可以使用retain
2.copy:在使用數組、字典、字符串作爲屬性的時候可以使用
copy 是爲了防止賦值的數組被釋放置空,影響屬性的數組所以使用copy生成一個新的數組
3.assign 直接賦值只要是基本數據類型都可以用assign
設置屬性的訪問權限
readwrite:開放了屬性的全部權限
readonly:只開放讀取權限(保護對象裏面的權限不被修改)

重寫 優先調用子類重寫的方法 如果子類還想實現父類同樣方法的功能

dealloc 銷燬對象
 - (void)dealloc{
具體銷燬對象的內容
//當引用計數爲0 是字懂調用者個方法
[super dealloc ];
}




發佈了37 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章