------oc語言記憶體管理一
一.記憶體管理的原理
1)、物件的所有權及引用計數
物件的所有權
任何物件都可能擁有乙個或者多個所有者,只要乙個物件至少擁有乙個所有者,它就會繼續存在
2)物件的引用計數器
每個oc物件都有自己的引用計數器,是乙個整數表示物件被引用的次數,即現在有多少東
西在使用這個物件,物件剛被建立時候,預設計數器值為1,當計數器的值變為0時候,物件銷毀。
3)引用計數器的作用
判斷物件要不要**的依據,計數器為0則銷毀,不為0則存在
4)對引用計數器的操作
給物件發訊息,retain訊息,計數器+1,該方法返回物件本身
release訊息,使計數器-1
retaincount訊息,獲得當前計數器值
5)物件的銷毀
當乙個物件的引用計數器為0時,那麼它將被銷毀,占用的記憶體被系統**
當物件被銷毀時候,系統會向物件傳送一條dealloc訊息,
在這裡釋放相關資源,dealloc就像是物件的遺言
一旦物件被**了,那麼他所佔據的儲存空間就不可能再利用,堅持使用會導致程式崩潰
二、記憶體管理的原則
1、只要有人在使用某個物件,那麼這個物件就不會被**
只要你想使用這個物件,那麼就應該讓這個物件的引用計數器+1
當你不想使用這個物件,就應該讓物件的引用計數器-1
2、誰建立誰release
如果你通過alloc,new,copy來建立乙個物件,那麼你就必須呼叫release或者autorelease方法
不是你建立的不用你去負責
3、誰retain誰release
只要你呼叫了retain,無論這個物件時如何生成,你都要呼叫release
三、野指標問題
1、單個物件的野指標問題
殭屍物件
#import@inte***ce person: nsobject
@propery int age;
@end
@implementation person
@end
int main()
物件記憶體洩漏
int main()
物件使用過程中被賦值nil 導致記憶體洩漏
int main()
在函式或者方法中使用retain或者relase不當,造成的問題
- (void)compare:(person*)person
person *p =[[person alloc]init];
nslog(@"p->retaincount = %ld",p.retaincount);
[p comper:p];//呼叫後retain操作+1
[p retain];//此時的物件沒有被收回,因為引用計數器沒有為0導致記憶體洩漏
2、多物件野指標問題
#import @inte***ce car : nsobject
-(void)run;
@end
@implementation car
-(void)dealloc
-(void)run
@end
@inte***ce person : nsobject
-(void)setcar:(car*)car;
-(car*)car;
-(void)driver;
@end
@implementation person
-(void)dealloc
-(void)setcar:(car*)car
-(car*)car
-(void)driver
@end
第一種野指標錯誤
person *p [person new];
car *car = [car new];
//給一輛車
[p setcar:car];
//車銷毀了
[car release];
//人駕車繼續走
[p dirver];
//因為車銷毀了 所以產生野指標錯誤
[p release]; //人物件銷毀
解決方法:
-(void)setcar:(car*)car
第二種記憶體洩漏
[p driver];
[p release];
人銷毀後,車沒有銷毀 造成記憶體洩漏
解決辦法:
-(void)dealloc
第三種記憶體洩漏
雙car物件交換時產生的記憶體洩漏
person *person =[[person alloc]init];
car *car1 =[[car alloc]init];
[person setcar:car1];
[person driver];
[car1 release];
//car1 的計數器為1
car *car2 =[[car alloc]init];
[person setcar:car2];
[car2 release];
[person release]; //這樣 car2 被銷毀了 car1 沒有被 銷毀 造成記憶體洩漏
解決辦法:
-(void)setcar:(car*)car
第四種 記憶體洩漏
person *person =[[person alloc]init];
car *car1 =[[car alloc]init];
[person setcar:car1];
[person driver];
[car1 release];
[person setcar:car1];
[person setcar:car1]; //重複給person 這樣就會造成引用計數器增加最後導致car不能被釋放,導致記憶體洩漏
解決辦法:
-(void)setcar:(car*)car
黑馬程式設計師學習筆記 OC之記憶體管理 2
黑馬程式設計師學習筆記 oc記憶體管理2 1 迴圈引用 對於迴圈依賴關係來說,比方a類引用b類,同時b類也引用a類這種 編譯會報錯。2 class 當使用 class在兩個類相互宣告,就不會出現編譯報錯,使用 class 類名 就可以引用乙個類,說明一下它是乙個類。3 和 import 的區別1 i...
黑馬程式設計師 OC語言初學
android培訓 ios培訓 期待與您交流!c語言的基礎上,增加了一層最小的物件導向語法 完全相容c語言 可以在oc 中混入c語言 甚至是c 可以使用oc開發mac os x平台和ios平台的應用程式 基本上所有關鍵字都是以 開頭 下面列舉一些常見的關鍵字,看一眼就行了,不用去翻資料查詢它們的含義...
黑馬程式設計師 OC語言 多型
1.多型的基本概念 某一類事物的多種形態 oc物件具有多型性 2.多型的體現 person p student new p age 100 p walk 子類物件賦值給父類指標 父類指標訪問對應的屬性和方法 3.多型的好處 用父類接收引數,節省 4.多型的侷限性 不能訪問子類的屬性 可以考慮強制轉換...