黑馬程式員學習筆記_OC之記憶體管理1
1、 為什麼要用記憶體管理:
移動裝置的記憶體極其有限,每個app所能占用的記憶體是有限制的
當app所占用的記憶體較多時,系統會發出記憶體警告,這時得回收一些不需要再使用的記憶體空間。比如回收一些不需要使用的對象、變量等
2、管理範圍:任何繼承了NSObject的對象,對其他基本資料類型(int、char、float、double、struct、enum等)無效
3、引用計數器:每個OC對象都有自己的引用計數器,是一個整數,表示“對象被引用的次數”,即有多少人正在使用這個OC對象,每個OC對象内部專門有4個位元組的存儲空間來存儲引用計數器。
4、引用計數器的操作
給對象發送一條retain消息,可以使引用計數器值+1(retain方法傳回對象本身)
給對象發送一條release消息,可以使引用計數器值-1
可以給對象發送retainCount消息獲得目前的引用計數器值
5、對象的銷毀
當一個對象的引用計數器值為0時,那麼它将被銷毀,其占用的記憶體被系統回收
當一個對象被銷毀時,系統會自動向對象發送一條dealloc消息
一般會重寫dealloc方法,在這裡釋放相關資源,dealloc就像對象的遺言
一旦重寫了dealloc方法,就必須調用[superdealloc],并且放在最後面調用
不要直接調用dealloc方法
一旦對象被回收了,它占用的記憶體就不再可用,堅持使用會導緻程式崩潰(野指針錯誤)
6、重寫dealloc方法。例如寫person的dealloc方法,person類中包含類car。
-(void) dealloc
{
[_car release];
[super dealloc];
}
7、概念
僵屍對象:所占用記憶體已被回收的對象。
野指針:指向僵屍對象(不可用記憶體)的指針,會報錯:EXC-BAD-ACESS:0X20
空指針:沒指向任何東西的指針,但不會報錯,p=nil後可以解決錯誤,OC中不存在空指針錯誤。
如果對象已經被回收,那麼再執行p.age時會出現錯誤:messagesent todeallocted instance 0x100109910是因為給釋放的資源發送了消息。
8、記憶體管理原則:
隻要還有人在用某個對象,那麼這個對象就不會被回收
隻要你想用這個對象,就讓對象的計數器+1
當你不再使用這個對象時,就讓對象的計數器-1
誰建立,誰release,誰retain誰release
9、set方法記憶體管理
如果你有個OC對象類型的成員變量,就必須管理這個成員變量的記憶體。比如有個Book*_book
set方法的實作
-(void)setBook:(Book *)book{
if (book != _book) {
[_book release];
_book = [book retain];
}
}
dealloc方法的實作
-(void)dealloc {
[_book release];
[super dealloc];
}
10、@property參數
控制set方法的記憶體管理:
retain :release舊值,retain新值(用于OC對象)
assign :直接指派,不做任何記憶體管理(預設,用于非OC對象類型)
copy :release舊值,copy新值(一般用于NSString*)
控制需不需生成set方法:
readwrite :同時生成set方法和get方法(預設)
readonly :隻會生成get方法
多線程管理
atomic :性能低(預設)
nonatomic :性能高
控制set方法和get方法的名稱:
setter :設定set方法的名稱,一定有個冒号:
getter :設定get方法的名稱