標籤:
引用計數器
每個OC對象都有一個佔4個位元組儲存空間的引用計數器
當使用或建立一個對象時,新對象的引用計數器預設是1
retain:可以使引用計數器+1
release:可以是引用計數器-1
retainCount:獲得當前的引用計數器的值
當對象被銷毀時,會重寫dealloc方法
-(void)dealloc
{
// 這句必須放在最後面
[super dealloc];
}
殭屍對象:所佔記憶體已經被回收的對象,殭屍對象不能再使用
野指標:指向殭屍對象(停用記憶體)的指標
錯誤:EXC_BAD_ACCESS :訪問了一塊壞的記憶體(已經被回收,停用記憶體)
null 指標:沒有指向任何東西的指標(儲存的是nil、NULL、0),給null 指標發訊息不報錯
多個物件記憶體管理
1. 當使用(佔用)某個對象就應該讓對象的引用計數器+1
(讓對象做一次retain操作)
2. 當不使用(佔用)某個對象就應該讓對象的引用計數器-1
(讓對象做一次release操作)
3.誰retain,誰release
set方法的記憶體管理
記憶體管理代碼規範:
1. 只要調用alloc,必須有release(autorelease),對象不是用alloc產生的,就不要寫release
2.set方法的代碼規範
1》基礎資料型別 (Elementary Data Type):直接賦值
- (void)setAge:(int)age
{
_age = age;
}
2> OC物件類型
- (void)setCar:(Car *)car
{
// 1.先判斷是不是新傳進來對象
if ( car != _car )
{
// 2.對舊對象做一次release
[_car release];
// 3.對新對象做一次retain
_car = [car retain];
}
}
3.dealloc方法的代碼規範
1> 一定要[super dealloc],而且放到最後面
2> 對self(當前)所擁有的其他對象做一次release
- (void)dealloc
{
[_car release];
[super dealloc];
}
1.set方法記憶體管理相關的參數
* retain : release舊值,retain新值(適用於OC物件類型)
* assign : 直接賦值(預設,適用於非OC物件類型)
* copy : release舊值,copy新值
2.是否要產生set方法
* readwrite : 同時產生setter和getter的聲明、實現(預設)
* readonly : 只會產生getter的聲明、實現
3.多線程管理
* nonatomic : 效能高 (一般就用這個)
* atomic : 效能低(預設)
4.setter和getter方法的名稱
* setter : 決定了set方法的名稱,一定要有個冒號 :
* getter : 決定了get方法的名稱(一般用在BOOL類型)
@property 參數
OC物件類型:
@property (nonatomic, retain) 類名 *屬性名稱;
@property (nonatomic, retain) Car *car;
@property (nonatomic, retain) id *car;
非OC物件類型
@property (nonatomic, assign) 類型名稱 屬性名稱;
@property (nonatomic, assign) int age;
@class Person;
@class的作用:告訴編譯器,Person是一個類
開發中引用一個類的規範
1. 在.h檔案中用@class來聲明類
2. 在.m檔案中用#import來包含類的所有東西
兩端循環參考解決方案:
1》一端用retain
2》一端用assigh
autorelease
在ios程式運行過程中,會建立無數個池子,這些池子都是以棧結構存在(先進後出)
當對象調用autorelease方法時,會將這個對象放到棧頂的釋放池
1. autorelease方法會返回對象本身
2. autorelease會把對象放到一個自動釋放池
3. 當自動釋放池被銷毀時,會對池子裡的所有對象做一次release操作
iOS 5.0 開始如下建立釋放池:
@autoreleasepool
{// {大括弧開始時就建立來自動釋放池
} // }大括弧結束代表銷毀釋放池
autorelease的使用注意:
1. 佔用記憶體較大的對象不要使用autorelease
2. 佔用記憶體較小的對象使用autorelease,沒有太大影響
系統內建的方法裡沒有包含alloc、new、copy,說明返回的對象都是autorelease的
NSString:NS是首碼,Next Step
開發中經常會提供一些類方法,快速建立一個已經autorelease過的對象
例:
+ (id)Person
{
// 建立對象時不要直接用類名,一般用self
return [[[self alloc] init] autorelease];
}
ARC
Automatic Reference Counting
ARC的判斷準則:只要沒有強指標指向對象,就會釋放對象
1.ARC特點
1> 不允許調用release、retain、retainCount
2> 允許重寫dealloc,但是不允許調用[super dealloc]
3> @property的參數
* strong :成員變數是強指標(適用於OC物件類型)
* weak :成員變數是弱指標(適用於OC物件類型)
* assign : 適用於非OC物件類型
4> 以前的retain改為用strong
指標分2種:
1> 強指標:預設情況下,所有的指標都是強指標 __strong
2> 弱指標:__weak
錯誤寫法(沒有意義的寫法):
__weak Person *p = [[Person alloc] init];
當兩端循環參考的時候,解決方案:
1> ARC
1端用strong,另1端用weak
2> 非ARC
1端用retain,另1端用assign
Objective-C(記憶體管理)