記憶體管理是每個程式設計師必須要掌握的技能, 也是寫好乙個程式,寫乙個好程式的必備技能. 下面談一下我對ios開發中的記憶體管理的理解.
如果你是乙個比較新的ios程式設計師, 那麼恭喜你, 你已經很輕鬆了, 因為在現在的開發中已經很少去手動管理記憶體了, 那麼問題來了, 既然不需要去手動管理了那學他還有什麼用呢? 當然有用, 因為之後你學了之後才會真正了解乙個物件的建立和消失過程. 而且對於比較老的第三方框架來說很多還是用的手動記憶體管理, 所以學好手動記憶體管理也是讀懂第三方框架的基礎. 對於有些較老的專案, 通常也是採用的手動記憶體管理, 如果想去維護也必須要學會手動記憶體管理.
對於初學者, 聽到記憶體管理就會有一種畏懼感, 其實對於oc來說很多底層的實現官方已經幫我們封裝好了, 所以我們要做的管理只有兩件事情, 第一就是記憶體洩露, 第二就是野指標. 簡單的說記憶體洩露就是指向物件的指標已經沒了, 但是這個物件依然在記憶體裡存在, 無法釋放, 當這樣的物件達到一定程度, 就會引起記憶體洩漏. 當物件釋放了, 而指向物件的指標中依然存著指向物件的位址, 再次對這個指標操作時,就會出問題, 這也是常說的殭屍物件.
記憶體管理遵循以下原則.
只要出現了
new,alloc,retain,引用計數retaincount就會加1, 因此
就一定配對出現乙個
release, 原則就是在**建立就在**release , 這樣就不容易出現遺漏. 對於多個物件相互引用的情況直接用**說明吧.
// main.m
//
手動記憶體管理
#import
#import
"person.h"
intmain(
intargc,
const
char
* argv)
return0;
}// car.h
//
手動記憶體管理
#import
@inte***ce
car :
nsobject
@property
intspeed;
- (void
)run;
@end
// car.m
//
手動記憶體管理
#import
"car.h"
@implementation
car
- (void
)dealloc
- (void
)run
@end
// person.h
//
手動記憶體管理
#import
#import
"car.h"
@inte***ce
person :
nsobject
- (void
)setname:(
nsstring
*)name;
- (nsstring
*)name;
- (void
)setcar:(
car*)car;
- (car*)car;
- (void
)drive;
@end
// person.m
//
手動記憶體管理
#import
"person.h" //
配對原則
:new alloc retain
對應乙個
release,autorelease
@implementation
person
- (void
)setname:(
nsstring
*)name
} - (nsstring
*)name
- (void
)setcar:(
car*)car
} - (car
*)car
- (void
)drive
- (void
)dealloc
@end
因為在person中存在乙個car物件, 所以在person銷毀時需要對car物件進行銷毀, 所以在 person類的dealloc方法中要對car進行release操作, 這樣才能保證所有物件都被正確釋放.
ios之手動記憶體管理
在建立物件的時候,回生成retaincount變數,alloc,new,retain都會使這個值 1,對應的release方法則會使這個值 1。當retaincount 0時系統會呼叫dealloc方法使系統銷毀改物件。所以我們在使用手動記憶體管理時,要注意一下問題 1.原則 記憶體管理原則 配對原...
iOS之手動記憶體管理
objective c採用了一種被稱為引用計數 reference counting 的機制來追蹤物件狀態,每個物件都有乙個與之關聯的整數,被稱為引用計數器。當乙個物件的引用計數為0時,表明程式不再需要該物件,物件會被銷毀。若是物件還持有其他物件的引用,必須重寫dealloc方法,在方法中釋放該物件...
記憶體洩露之手動記憶體管理 MRC
由於移動裝置的記憶體是有限的,如果建立的物件用完不及時的銷毀 釋放 的話,就會造成記憶體洩露.如果該物件的記憶體空間釋放了,但是依舊在使用的話,那麼就是殭屍物件.同時指向殭屍物件的指標就是野指標.對於記憶體管理的原則是,不用的物件就要 其所占用的空間,防止造成記憶體洩露.並且我們要知道,記憶體洩露主...