oc記憶體管理的範圍
管理任何繼承
nsobject
的物件,對其他的基本資料型別無效。
oc記憶體管理分類
1)mannulreference counting(mr
c,手動管理
,在開發
ios4.1
之前的版本的專案時我們要自己負責使用引用計數來管理記憶體,比如要手動 retain、release、autorelease 等,而在其後的版本可以使用 arc,讓系統自己管理記憶體。)2)
automatic reference counting
(arc
,自動引用計數
,ios4.1
之後推出的)
手動記憶體管理應遵守以下原則:
1)只要某個物件還在被使用,那麼這個物件就不會被**;只要想使用這個物件,那麼就應該讓這個物件的引用計數器
+1;當不想使用這個物件時,應該讓物件的引用計數器
-1; 2)
如果你通過
alloc,new,copy
來建立了乙個物件,那麼你就必須呼叫
release
或者autorelease
方法3)
只要你呼叫了
retain
,無論這個物件時如何生成的,你都要呼叫
release
記憶體管理判斷物件被**的關鍵是重寫dealloc的方法:
- (void) dealloc
1)在這裡一定不要直接通過物件呼叫
dealloc
方法(實際上呼叫並不會出錯)一旦物件被**了
, 它占用的記憶體就不再可用
, 堅持使用會導致程式崩潰(野指標錯誤)為了防止呼叫出錯,可以將「野指標」指向
nil(
0)。
person.h
#import
@inte***ce
person :
nsobject
@property int
age;
@end
person.m
#import
"person.h"
@implementation
person
//物件是否被**的方法
-(void
)dealloc
@end
main.m
int main(int argc, const char * argv)
return 0;
}執行結果為:
2015-08-05 19:05:41.126 per[2443:234932] p.retaincount = 1
2015-08-05 19:05:41.127 per[2443:234932] p.retaincount = 2
2015-08-05 19:05:41.128 per[2443:234932] p.retaincount = 1
2015-08-05 19:05:41.128 per[2443:234932]物件被銷毀了~
所以在進行手動記憶體管理時,一定要嚴格遵守記憶體管理原則,否則容易出現野指標和記憶體洩漏
野指標情況:
int main(int argc, const char * argv)
return 0;
}記憶體洩漏情況:
int main(int argc, const char * argv)
return 0;
}由於上面的引用計數不等於0,程式就結束了,p物件不會釋放,這是就造成了記憶體洩漏,使用手動記憶體管理要特別小心。一般使用
自動記憶體管理。
黑馬程式設計師 OC 記憶體管理
1.什麼是記憶體管理 管理範圍 任何繼承了nsobject的物件,對其他基本型別無效 2.物件的基本結構 每個oc物件都有自己的引用計數器,是乙個整數,表示 物件被引用的次數 即有多少個人正在使用oc物件 每個oc物件內部專門有4個位元組的儲存空間來儲存引用計數器 3.引用計數器的作用 當使用all...
黑馬程式設計師 OC基礎 記憶體管理
oc的區域性變數在 塊結束時被系統銷毀,記憶體被 oc的物件,內部有引用計數器,當引用計數器的值為0時,被系統銷毀,記憶體被 區域性變數存放在棧中.物件存放在堆中.注意,物件指標還是存放在棧中,物件本身占用的記憶體存放在堆中.在oc中,我們要對自己寫的繼承了nsobject的物件進行記憶體管理.物件...
黑馬程式設計師 OC語言 5 記憶體管理
若排版有錯誤,請檢視pdf版 2 管理範圍 任何繼承了 nsobject 的物件,對其他基本資料型別 int char float double struct enum等 無效 1 每個oc物件都有自己的引用計數器,是乙個整數,表示 物件被引用的次數 即有多少人正在使用這個oc物件。2 每個oc物件...