天天看點

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

-------  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

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

在實作中寫;

@implemention       Person

@end

在主函數中寫;

Int main()

{

Person *p = [ [ [Person alloc]  init] autorelease];

P.age = 10;

Return 0

}

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

代碼放在這裡會有很好的效果,自動釋放記憶體池。

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

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]; 

}

}

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

C.常見使用錯誤

1、多次釋放記憶體,導緻野指針。不能同時用autoreleasepool和[類對象 release];

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

池子已銷毀,多次釋放記憶體,形成野指針。

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

D.自動釋放池

1、運用@autoreleasepool {程式放在這裡就是}

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

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;

}

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

注解:[Person person]等價于[self person]; 去目前類中尋找person的類方法。就是去尋找如下如所示;

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

在建立另外一個類。好人(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、執行個體舉例,建立項目的時候要勾選下面的框框

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

在主函數中。

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指向同一個對象(位址塊)

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

__weak   Person  *p2  =  p;//這個情況下指針p2為弱指針。關鍵字為__weak

弱指針不能決定是否被釋放。

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

P = nil;//此處p被清空。

注意:一旦發現弱指針指向的對象沒有了,編譯器會自動清空指針。

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

__weak Person  *p = [[Person alloc]init];

這一行代碼過後,指針指向的位址被清空。是以列印出來的為NULL。

3>ARC中的@property和strong

@property       (nonatomic,     strong)  Dog  *dog;//指明dog為強指針。

@property       (nonatomic,     weak) Dog  *dog;//指明dog為弱指針。

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

p.dog;作用就是調用set方法(setDog:10)。

4>ARC特點

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease 

5>ARC使用注意

黑馬程式員 -- OC語言 Autorelease第五講 Autorelease