內存管理多線程
範圍: 任何繼承了NSObject的對象 對基本數據類型無效性能
原理: 每一個對象內部都保存了一個與之相關聯的整數 稱爲引用計數器優化
1.計數器的基本操做atom
當使用alloc new或者copy建立一個對象時 對象的引用計數器被設置爲1spa
retain: 計數器+1 會返回對象自己線程
release: 計數器-1 沒有返回值指針
retainCount: 獲取當前的計數器值code
dealloc: 當一個對象要被回收的時候 就會調用 必定要調用[super dealloc];這句調用要放在最後面對象
殭屍對象: 所佔用內存已經被回收的對象 殭屍對象不能再使用blog
野指針: 指向殭屍對象(不可用內存)的指針 給野指針發送消息報錯(EXC_BAD_ACCESS)
空指針: 沒有指向任何東西的指針(存儲的東西是nil NULL 0) 給空指針發送消息不會報錯
2.內存管理原則
誰建立 誰釋放 若是你經過alloc new或者copy建立一個對象 那麼你必須調用release或autorelease 換句話說 不是你建立的 就不用你去釋放
通常來講 除了alloc new或者copy以外的方法建立的對象都被聲明瞭autorelease
誰retain 誰release 只要你調用了retain 不管這個對象是如何生成的 你都要調用release
規範: 只要調用了alloc 必須有release 或 autorelease
set方法的實現
/** 基本數據類型 直接複製 **/ - (void) setAge : (int) age { _age = age; } /** OC對象類型 **/ - (void) setCar : (Car *) car { //先判斷是否是新傳進來的對象 if (car != _car) { //對舊對象作一次release [_car release]; //對新對象作一次retain _car = [car retain]; } }
dealloc方法的實現
//必定要 [super dealloc]; 並且放到最後面 //對self (當前) 所擁有的對象作一次release - (void) dealloc { [_car release]; [super dealloc]; }
3.@property參數
@property (參數, 參數 …) int height;
注意同類型的參數不能寫多個
a.set方法內存管理相關的參數
retain: release舊值 retain新值(適用於OC對象類型)
assign: 直接賦值(默認 適用於非OC對象類型)
copy: release舊值 copy新值
b.是否要生成set方法
readwrite: 同時生成set和get的聲明 實現(默認)
readonly: 只會生成get 聲明 實現
c.多線程管理
nonatomic: 性能高(通常就用這個)
atomic: 性能低(默認)
d.set 和 get 方法的名稱
setter = : 決定了set方法的名稱, 必定要有個冒號 :
getter = : 決定了get方法的名稱, (通常用在BOOL類型)
4.循環retain和@class
循環retain
好比A對象retain了B對象 B對象retain了A對象
這樣會致使A對象和B對象永遠沒法釋放
解決方案: 當兩端互相引用時 應該一端用retain 一端用assign
@class的做用: 僅僅告訴編譯器 某個名稱是一個類
@class Person; 僅僅告訴編譯器 Person是一個類
在開發中引用一個類的規範
在.h文件中用@class來聲明類
在.m文件中用#import來包含類的全部東西
5.autorelease
int main() { @autoreleasepool {// {開始 表明建立了釋放池 Person *p = [[[Person alloc] init] autorelease]; p.age = 10; }// }結束 表明銷燬了釋放池 return 0; } /** autorelease基本用法 **/ //會將對象放到一個自動釋放池中 //當自動釋放池被銷燬時 會對池子裏的全部對象作一次release操做 //會返回對象自己 //調用完autorelease方法後 對象的計數器值不變 /** autorelease的好處 **/ //不用再關心對象釋放的時間 //不用再關心何時調用release /** autorelease的使用注意 **/ //佔用內存較大的對象不要隨便使用autorelease //佔用內存較小的對象使用autorelease沒有太大影響 /** 錯誤寫法 **/ //alloc後調用了autorelease 又調用release //連續調用屢次autorelease /** 自動釋放池 **/ //在IOS程序運行過程當中 會建立無數個池子 這些池子都是以棧結構存在(先進後出) //當一個對象調用autorelease方法時 就將這個對象放到棧頂的釋放池 /** 開發過程當中常常寫一些類方法快速建立一個autorelease的對象 建立對象時不要直接使用類名 用self **/
ARC
1.基本簡介
ARC是自iOS 5以後增長的新特性 徹底消除了手動管理內存的煩瑣 編譯器會自動在適當的地方插入適當的retain release autorelease語句 你再也不須要擔憂內存管理 由於編譯器爲你處理了一切
ARC是編譯器特性 而不是IOS運行時特性 不一樣於其它語言中的垃圾收集器 所以ARC和手動內存管理性能是同樣的 有時還能更加快速 由於編譯器還能夠執行某些優化
2.基本原理
規則: ARC的規則很是簡單 只要還有一個強指針變量指向對象 對象就會保持在內存中
強指針: 默認狀況下 全部的指針都是強指針 __strong
弱指針: 弱指針指向的對象被回收後 弱指針會自動變爲nil指針 不會引起野指針錯誤 __weak
3.使用注意
不能調用release, retain, autorelease, retainCount
能夠重寫dealloc, 可是不能調用[super dealloc];
@property的參數
strong: 成員變量是強指針 (適用於OC對象類型)
weak: 成員變量是弱指針 (適用於OC對象類型)
assign: 適用於非OC對象類型
將不使用ARC時用的retain替換成strong
兩端互相引用時: 一端用strong 一端用weak
關閉整個項目的ARC
關閉某個.m文件的ARC