黑馬程序員——IOS基礎——OC內存管理循環retain和autorelease

------- android培訓java培訓、期待與您交流!

循環retain:

涉及到循環引用:身份證Card和人Person就是相互包含的

這個時候需要使用@class

使用:@class Card;        它在person.h中代替#import "Card.h"

他的作用僅僅是告訴編譯器,Card是一個類

我倒是覺得這和java中配置數據庫關係中,一對一,一對多,多對多的時候,需要告訴雙方。

如果在點m文件中需要使用類對象的時候,再導入進來---------比如在dealloc方法中release


一般頭文件中不用#import Car.h ,因爲import的意思就是拷貝,如果改變Car.h,那麼有100個類引用了Car.h就要再次拷貝100次,所以最好用@class

但有個特例,那就是父類一定要引用#import

1.@class作用:僅僅是告訴編譯器,某個名稱是一個類

@class Person

2.開發中引用一個類的規範:

>在點h頭文件中,用@class來聲明類

>在點m文件中用#import來包含類的所有東西

3.兩端循環引用解決方案:

>一端用retain

>一端用assign-----計數器不變


autorelease:

1.會將對象放到一個自動釋放池中

2.當自動釋放池被銷燬時,會對池子中所有對象做一次release操作

3.會返回對象本身

4.調用完autorelease方法後,對象計數器 不變

好處:

1.媽媽以後再也不用擔心我必須把release寫在最後面了

2.也不再關心什麼時候調用release

注意:
1.佔用內存較大的對象不要隨便使用autorelease
2.佔用內存較小的對象使用時影響不大。


ios5.0後使用方式:

@autoreleasepool{
	//開始創建釋放池1
	Person *p = [[[Person alloc] init] autorelease];
	p.age = 10;
	@autoreleasepool{
		//池子2
	}
	//開始銷燬釋放池
}	//到這之後Person銷燬


可以創建無數個釋放池,並且池子都是存放在中,先進後出

但這樣不能準確控制時間,適合小對象

調用aurorelease只是將對象放到池子裏面,對於對象計數器沒有任何影響

使用錯誤注意:

1.要麼使用autorelease 要麼使用release,不能同時使用

2.不能多次調用:Person *p = [[[[Person alloc] init] autorelease] autorelease];

======================實際開發=========================

爲了不用每一次都寫很長的autorelease ,開發中常設計一個類方法(類名開頭)返回autorelease對象

+ (id)person{
	return [[[self alloc] init] autorelease]; //儘量使用self,這樣可以滿足子類的需求
}
+ (id)personWithAge:(int)age{
	//Person *p = [Person person];/[self person];這一句代替下面一句
	Person *p =[[[self alloc] init] autorelease];//這裏的self好處很大哦,以後任何子類調用這個方法創建person子類對象,都會返回子類對象,而不是Person父類對象
	p.age=age;
	return p;
}

調用時:

Person *p = [Person person];
Person *p1 = [Person personWithAge:100]; //返回帶有參數的類方法

規律:

1.系統自帶的方法裏面沒有包含alloc、new、copy,說明返回的對象都是autorelease的

NSString *str = @"123123"; //由於不是通過alloc,不用release,因爲默認是autorelease

NSString *str2 = [NSString stringWithFormat:@"age is %d",10];

2.開發中設計一個返回autorelease對象的類方法,方法名以類名開始+With+

NSNumber *num = [NSNumber numberWithInt:100];

3.在父類中創建對象時不要直接用類名,一般用self,可以,滿足子類需求

------- android培訓java培訓、期待與您交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章