------- android教育訓練、.Net教育訓練、IOS教育訓練 、 碧空海的技術部落格,期待與您交流! ----------
第五講 Autorelease
A.autorelease基本使用
在聲明中寫;
@interface Person :NSObject
@property (nonatomic, assign) int age;//nonatomic讓代碼處于高性能。Assign僅僅用于成員變量。setAge:(int)age。
@property (nonatomic, retain) NSString *name;
@end
在實作中寫;
@implemention Person
@end
在主函數中寫;
Int main()
{
Person *p = [ [ [Person alloc] init] autorelease];
P.age = 10;
Return 0
}
代碼放在這裡會有很好的效果,自動釋放記憶體池。
B.autorelease使用注意
在主函數中寫;
Int main()
{
@autoreleasepool
{
Person *p = [ [ [Person alloc] init] autorelease];
P.age = 10;
@autoreleasepool
{
Person *p1 = [ [ [Person alloc] init] autorelease];
P1.age = 10;
}
//在程式運作過程中可以建立無限個自動釋放池,他們都是放在棧中的,棧有先進後出的特點。
//autorelease不能實作類對象的精确釋放,精确釋放僅僅用類對象的[p release];
}
}
C.常見使用錯誤
1、多次釋放記憶體,導緻野指針。不能同時用autoreleasepool和[類對象 release];
池子已銷毀,多次釋放記憶體,形成野指針。
D.自動釋放池
1、運用@autoreleasepool {程式放在這裡就是}
E.autorelease的應用
1、在聲明中
@property (nonatomic, assgin) int age;
+(id)person
{
Return [[[person alloc ] init] autorelease];
}
+(id)
-(void)dealloc
{
NSLog(@”hhhhhhhhhhhh’);
[super dealloc];
}
2、在主函數中
Person *p =[[[Person alloc] init]autorelease];
p.age = 20;
[p release];
@autoreleasepool
{
Person *p2 = [[Person person]];
P2.age = 100;
}
注解:[Person person]等價于[self person]; 去目前類中尋找person的類方法。就是去尋找如下如所示;
在建立另外一個類。好人(GoodPerson)類繼承于Person類;繼承了父類Person 就擁有了父類中的所有可用方法。
@interface GoodPerson :Person
@property (nonatomic, assign) int money; //有一個金錢的屬性
@end
在主函數中可以這樣操作了
@autorelease pool
{
GoodPerson *p= [GoodPerson personWithAge:10];// personWithAge這個方法屬于父類的
// [GoodPerson personWithAge:10]這個方法傳回的事Person的對象。
p.money = 100;
}
F.用法總結
一、計數器的基本操作
1>retain;:+1
2>release:-1
3>retainCount:獲得計數器值
二、set方法的記憶體管理
1>set方法的實作
-(void)setCar:(Car *)car
{
If (car != -car)
{
[-car release];
-car = [car retain];
}
}
2>dealloc方法的實作(不直接調用dealloc)
-(void)dealloc
{
[-car release];
[super dealloc];
}
三、@property參數使用
1>OC對象類型
@property (nonatomic, retain) 類名 *屬性名
@property (nonatomic, retain) Car *car;
@property (nonatomic, retain) id car
//被retain過的對象,必須在dealloc方法中release屬性
1>非OC對象類型
@property (nonatomic, assgin) 類名名稱 屬性名
@property (nonatomic, assgin) int age;
四、autorelease
1>系統自帶的方法中,如果不包含有alloc、new、copy,那麼這些方法傳回的對象都是已經autorelease過的
2>開發中經常寫一些類方法快速建立一個autorelease的對象
*建立對象的時候不要直接使用類名,應該用self.
G.ARC基本原理
1、執行個體舉例,建立項目的時候要勾選下面的框框
在主函數中。
Person *P = [[Person alloc] init];
P.age = 10;
[p release];//在使用ARC的時候,這個調用是錯誤的。隻要是關于記憶體有關的這些功能,均不能調用了
如何驗證,接下來在類的實作中重寫dealloc方法(在編譯器中有預設的這個函數)
-(void)dealloc
{
NSLog(@”現在調用了”);
[super dealloc];//ARC已經開啟,在調用和内錯有關的将會出錯。
}
2、ARC原理
1>判斷準則;隻要沒有強指針指向對象,就會釋放對象。
指針分兩種;弱指針和強指針(預設情況下,所有指針是強指針)
Person *p2 = p;//就是把P指向的位址給P2,繼而P2也指向Person對象。是以p和p2指向同一個對象(位址塊)
__weak Person *p2 = p;//這個情況下指針p2為弱指針。關鍵字為__weak
弱指針不能決定是否被釋放。
P = nil;//此處p被清空。
注意:一旦發現弱指針指向的對象沒有了,編譯器會自動清空指針。
__weak Person *p = [[Person alloc]init];
這一行代碼過後,指針指向的位址被清空。是以列印出來的為NULL。
3>ARC中的@property和strong
@property (nonatomic, strong) Dog *dog;//指明dog為強指針。
@property (nonatomic, weak) Dog *dog;//指明dog為弱指針。
p.dog;作用就是調用set方法(setDog:10)。
4>ARC特點
5>ARC使用注意