標籤:
iOS中建立對象的步驟:
1,分配記憶體空間,儲存物件
2,初始化成員變數
3,返回對象的指標地址
第一:非ARC機制:
1,對象在建立完成的同時,內部會自動建立一個引用計數器,是系統用來判斷是否回收對象的唯一標示,當我們的應用計數retainCount = 0的時候,系統會回收當前對象
2,[對象 release] retainCount - 1;
3,[對象 retain] retailCount + 1;
4,當應用計數retailCount = 0的對象就會被銷毀;
5,dealloc函數,當一個對象銷毀的時候,系統會自動調用dealloc函數,通知對象將要被銷毀
記憶體管理原則(配對原則):只要出現了new,alloc,retaim,就一定配對出現一個release,autorelease
註:EXC_BAD_ACCESS 訪問了不可訪問的記憶體空間
被系統回收的對象,稱為殭屍對象
預設情況下,xcode為了提高編碼效率,不會時時檢查殭屍對象
手動記憶體研究問題包括:
1,野指標操作
2,記憶體泄露:不再使用的對象,一直在記憶體中沒有被銷毀
//面試筆試,出題率非常高
- (void)setCar:(Car *)car{ if (_car != car) { //relese舊值 [_car release];//[nil release]; //retain新值 _car = [car retain]; }}- (Car *)car{ return _car;}- (void)dealloc{ //目的是要保證在p對象存在的時候,car對象一定存在 [_car release]; [super dealloc]; NSLog(@"Person 被銷毀了");}
第二:ARC機制
研究ARC機制,就必須清楚@property的作用:
1.生產get與set方法的聲明
2.產生get與set方法的簡單實現
3.若果你沒有聲成名相對象的成員變數,那麼他會自動產生一個_開頭的成員變數
@property 參數分為4類
1.與set方法記憶體管理相關參數
retain: 要產生符合記憶體管理原則的set方法(應用與物件類型)
assign: 直接賦值,(物件類型,基礎資料型別 (Elementary Data Type)),簡單的
copy :
2.多線程相關
nonatomic: 不產生多線程線管代碼,使用這個就可以了(效率高一點)
atomic:產生多線程線管代碼(不寫預設是這種方式)
實際開發中,只要是物件類型的@property都寫成下面
3.是否要產生set與get方法
readwrite: 可讀可寫屬性,同時產生set與get方法
readonly : 唯讀屬性,只產生get方法
4.set與get方法名稱相關的參數
setter:設定產生的set方法名稱
getter:設定產生的get方法名稱
例如:
@property (nonatomic,retain) Car * car;
@property (nonatomic,retain)NSString * name;
@property (nonatomic,assign)int age; //int float double char
@property (nonatomic,assign)int weight;
@property (nonatomic,assign,readonly)int idCard;
//改變set與get方法名稱很多都是用在BOOL類型的變數
@property (nonatomic,assign,setter = isDeid:,getter = isDeid)BOOL isDeid;
iOS中記憶體管理