引用計數器
每個oc物件都有乙個佔4個位元組儲存空間的引用計數器
當使用或建立乙個物件時,新物件的引用計數器預設是1
retain:可以使引用計數器+1
release:可以是引用計數器-1
retaincount:獲得當前的引用計數器的值
當物件被銷毀時,會重寫dealloc方法
-(void)dealloc
// 這句必須放在最後面
[super dealloc];
殭屍物件:所佔記憶體已經被**的物件,殭屍物件不能再使用
野指標:指向殭屍物件(不可用的記憶體)的指標
錯誤:exc_bad_access :訪問了一塊壞的記憶體(已經被**,不可用的記憶體)
空指標:沒有指向任何東西的指標(儲存的是nil、null、0),給空指標發訊息不報錯
多物件記憶體管理
1. 當使用(占用)某個物件就應該讓物件的引用計數器+1
(讓物件做一次retain操作)
2. 當不使用(占用)某個物件就應該讓物件的引用計數器-1
(讓物件做一次release操作)
3.誰retain,誰release
set方法的記憶體管理
記憶體管理**規範:
1. 只要呼叫alloc,必須有release(autorelease),物件不是用alloc產生的,就不要寫release
2.set方法的**規範
1》基本資料型別:直接賦值
- (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;
@classperson;
@class的作用:告訴編譯器,person是乙個類
開發中引用乙個類的規範
1. 在.**件中用@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 下劃線下劃線strong
2> 弱指標:__weak 下劃線下劃線weak
錯誤寫法(沒有意義的寫法):
__weak person *p = [[person alloc] init];
當兩端迴圈引用的時候,解決方案:
1> arc
1端用strong,另1端用weak
2> 非arc
1端用retain,另1端用assign
Objective C記憶體管理
objective c的物件記憶體管理是一件非常有意思的事情,由其是在iphone嵌入式裝置中 想玩的省心點,就得熟知它的管理規則,由其是記憶體的管理機制。了解它的品性了才能在cocoa的世界裡如魚得水。否則,反之 如水得魚!1,乙個物件可以有乙個或多個擁有者 2,當它乙個擁有者都沒有時,它就會被 ...
Objective C 記憶體管理
objective c 記憶體管理 nsautoreleasepool pool nsautoreleasepool alloc init pool drain 事實上程式中可以有多個自動釋放池。自動釋放池其實並不包含實際的物件本身,僅僅是對釋放的對 象的引用。通過向目前的自動釋放池傳送一條auto...
Objective C 記憶體管理
objective c中,記憶體物件分二類 1 值型別,如 int float struct等基本資料型別 2 引用型別,通常是指繼承自nsobject類的oc物件 值型別在棧中,由系統自動管理,而引用型別在堆上,需要我們自己手工進行管理 oc中提供了二種記憶體管理機制 1 手動引用計數 mrc m...