5.21日(rì)音(yīn)訊,objective-C-引用λ↓(yòng)計(jì)數(shù)詳解
日(rì)期:2013-05-21發布:首創網絡浏覽:606次
5.21日(rì)音(yīn)訊,objective-C-引用(y"δòng)計(jì)數(shù)詳解。obj-c本質就₩♥(jiù)是(shì)改進過的(de)c∞←γλ語言,大(dà)家(jiā)都(dōu)知(zhī)道(dào)c語言是(s ✘'$hì)沒有(yǒu)垃圾回收(GC)機(jī€←)制(zhì)的(de)(注:雖然obj-c∞←λ✘2.0後來(lái)增加了(le)GC功能(néng),但(dàn)是(s→γσhì)在iphone上(shàng)不(bù)能(nén€→g)用(yòng),因此對(duì)于iOS平台的(≤•★←de)程序員(yuán)來(lái)講,這(zhè)個(gè)幾乎¥···
本文(wén)關鍵字:5.21日(rì),音(yīn)訊,objec☆γ§tive-C-,引用(yòng),計(j↓±↔ì)數(shù),詳解,5.21
5.21日(rì)音(yīn)訊,objective-C-引用(yòng™"™)計(jì)數(shù)詳解。obj-c本質就(jiù)是↑δ<(shì)"改進過的(de)c語言",大(dà)家(jiā)↑©都(dōu)知(zhī)道(dào)c語言是§✘(shì)沒有(yǒu)垃圾回收(GC)機(jī)制≥>←(zhì)的(de)(注:雖然obj-c2©π✘.0後來(lái)增加了(le)GC功能(néng),但(dàn)♣®ασ是(shì)在iphone上(shàng)不(bù)能(néng)用(yòn∞≥σ☆g),因此對(duì)于iOS平台的(de)程序員(yuán)來(lα>ái)講,這(zhè)個(gè)幾乎沒啥用(yòng)),所以在obj-c>♠中寫程序時(shí),對(duì)于資源的(d≥¥δe)釋放(fàng)得(de)由開(kāi)發人(rén↓' )員(yuán)手動處理(lǐ),相(x∑γiàng)對(duì)要(yào)費(fè∞☆i)心一(yī)些(xiē)。
引用(yòng)計(jì)數(shù)
這(zhè)是(shì)一(yī)種古老←£≈(lǎo)但(dàn)有(yǒu)效的(de)內(nèi)存管♥✘<★理(lǐ)方式。每個(gè)對(duì)Ωγ象(特指:類的(de)實例)內(nèi)部都(←£dōu)有(yǒu)一(yī)個(gè)reta αinCount的(de)引用(yòng)計(jì)↑£♥數(shù),對(duì)象剛被創建時(shí),retainCount為(w≠♥§èi)1,可(kě)以手動調用(yòng)retain方法使retaiβ✘•ΩnCount+1,同樣也(yě)可(kě)以手↔ε>動調用(yòng)release方法使retainC♥αount-1,調用(yòng)releaφ♣∑αse方法時(shí),如(rú)果retaγΩ✔inCount值減到(dào)0,系統将自(zì♦¥∞♠)動調用(yòng)對(duì)象的(de)dealloc方法(類似于c#®&中的(de)dispose方法),開(kāi)•→≈≠發人(rén)員(yuán)可(kě)以在dealloc中釋放(f÷↓↔♣àng)或清理(lǐ)資源。
1、基本用(yòng)法
為(wèi)了(le)演示這(zhè)種基本方式,先定×βπ義一(yī)個(gè)類Sample
類接口部分(fēn)Sample.h
//
//Sample.h
//MemoryManage_1
//
//Createdbyjimmy.yangon11-2-19≠₩¶.
//Copyright2011__MyCompanyNa→↕ ₹me__.Allrightsreserve×'¥d.
//
#import
@interfaceSample:NSObject{
}
@end
類實現(xiàn)部分(fēn)S₽αample.m
//
//Sample.m
//MemoryManage_1
//
//Createdbyjimmy.yangon11-2-19.
//Copyright2011__MyCompanyName__.¶∑Allrightsreserved.
//
#import"Sample.h"
@implementationSample
-(id)init
{
if(self=[superinit]){
NSLog(@"構造函數(shù)§£★被調用(yòng)了(le)!當前引用(yòngλ±✔π)計(jì)數(shù):%d",[selfretainCount])Ωγφ;
}
return(self);
}
-(void)dealloc{
NSLog(@"析構函數(shù)将要(δ₹yào)執行(xíng)...,當前引用(yòng)計(jì)數(shù):'®÷♠%d",[selfretainCount]);
[superdealloc];
}
@end
代碼很(hěn)簡單,除了(le)"♠™±構造函數(shù)"跟"析構函數(shù)"之外(wài),沒有(yǒu)任ε♦&何其它多(duō)餘處理(lǐ)。
主程序調用(yòng)
#import
#import"Sample.h"
intmain(intargc,constchar*argv[]≥•){
Sample*_sample=[Samplenew];//構造函數₹♥(shù)被調用(yòng)了(le)!當前引用(yòng)計(jì)數(shΩ↔♣ù):1
NSLog(@"_sample.retainCoδ€unt=%d",[_sampleretainCount]);//1£φ
[_sampleretain];
NSLog(@"_sample.retainCount=%d",[_s₩ γampleretainCount]);//'≤2
[_sampleretain];
NSLog(@"_sample.retainCount=%d",[_s×Ω↕★ampleretainCount]);//3
[_samplerelease];
NSLog(@"_sample.ret"$σ"ainCount=%d",[_sampleretainCount♣₹]);//2
[_samplerelease];
NSLog(@"_sample.retainCo> unt=%d",[_sampleretainCount♠↑✔]);//1
[_samplerelease];//析構函數(σ shù)将要(yào)執行(xíng).↕★↑..,當前引用(yòng)計(jì)數(shù):1
NSLog(@"_sample.re↕≥✔tainCount=%d",[_sampler¶®♠etainCount]);//1,注:即便是(s↓✔$εhì)在析構函數(shù)執行(xíng)後,如(rú)果立即再次引用(×yòng)對(duì)象的(de)retainCount,仍然返回1,但(dà©£∑n)以後不(bù)管再試圖引用(yòng)該對(duì)象的(de)∑"§任何屬性或方法,都(dōu)将報(bào)錯(cuò)
NSLog(@"_sample.re'✘♦÷tainCount=%d",[_sampleretainCo φλunt]);//對(duì)象被釋放(fàng)之後,如(r≥α↔♠ú)果再嘗試引用(yòng)該對(duì)象的(de)任何其它方法,則報(b↓≈ào)錯(cuò)
//[_sampleretain];//同上(s≤$€♣hàng),會(huì)報(bào)錯(cu<©♥÷ò)
return0;
}
這(zhè)段代碼主要(yào)驗證:對(duì)象剛創建時(shí)r¥etainCount是(shì)否為(wèi)1,以及retain和(h₽•é)release是(shì)否可(kěσ✔)以改變retainCount的(de)值↑σ≈,同時(shí)retainCount減到(dào)0時(shí),是(shì₹ ₹)否會(huì)自(zì)動執行(xíng)dealloc函數(s∞hù)
nil的(de)問(wèn)題:
1.1如(rú)果僅聲明(míng)一(yī)個(gè)Sa≠¥εmple類型的(de)變量(其實就(jiù→♠$↕)是(shì)一(yī)個(gè)指針),而不(↑≠•≤bù)實例化(huà),其初始值為(wèi™₩)nil
1.2變量實例化(huà)以後,就(jiù)算(su∑∞€àn)release掉,dealloc被成功調用(yòng),其§λ∞retainCount并不(bù)馬上(shàng)回到(dào)≠≠↔0(還(hái)能(néng)立即調用(yòng)一(yī♦∏)次且僅一(yī)次[xxxretain ₩±Count]),而且指針變量本身(shēn)也(yě)不(bù)≤→÷ 會(huì)自(zì)動歸為(wèi)nil值
1.3dealloc被調用(yòng)後,必須手動'♥ε賦值nil,retainCount才會(huì)£&λ≤自(zì)動歸0
以上(shàng)結論是(shì)實際試驗得(de)出§♦≈來(lái)的(de),見(jiàn)下'≥₩₹(xià)面的(de)代碼:
Sample*s;
NSLog(@"s%@,retainCoβαunt=%d",s==nil?@"isnil$¥":@"isnotnil",[sretainC₽↕ount]);//sisnil,retainCount=0
s=[Samplenew];
NSLog(@"s%@,retainCou&'nt=%d",s==nil?@"isnil":@"isnotnil✔©",[sretainCount]);//sisnotnil&∑≠™,retainCount=1
[srelease];
NSLog(@"s%@,retaiε←©>nCount=%d",s==nil?@"isnil":@"isno λtnil",[sretainCount]);/∏σ/sisnotnil,retainCount=1
//NSLog(@"s%@,reta$₩→inCount=%d",s==nil?@"<isnil":@"isnotnil",[sretainCount]);/♣φ/報(bào)錯(cuò):Programrec§<→eivedsignal:“EXC_BAD_ACCESS&rdquλ•o;.
s=nil;
NSLog(@"s%@,retainCount=%d",s==ni₹←★l?@"isnil":@"isnotnil",[sre tainCount]);//sisnil,retain∑↑Count=0
所以千萬别用(yòng)if(x==ni$'λΩl)或if([xretainCount]==0)來(lái)判斷對(d£∑uì)象是(shì)否被銷毀,除非你(nǐ)每次銷毀對(duì)象後,手動"♥顯式将其賦值為(wèi)nil
2、複雜(zá)情況
上(shàng)面的(de)示例過于簡章(zhγ≠§āng),隻有(yǒu)一(yī)個(gè)類自(zì)己獨耍,如®✘≠★(rú)果有(yǒu)多(duō)個(gè)類,且相(xiàng)互☆σ≈之間(jiān)有(yǒu)聯系時(shí),情況 εβ要(yào)複雜(zá)一(yī)些(xiē)。下(x€≤©πià)面我們設計(jì)二個(gè)類Shoe和(hé)Man(即&¥♣ldquo;鞋子(zǐ)類”和σ£(hé)”人(rén)&ld→♣quo;),每個(gè)人(rén)都(dōu)要(yào)穿鞋,所以Ma✔∑☆n與Shoe之間(jiān)應該是(shì)Man擁有(yǒu)≥λShoe的(de)關系。
Shoe.h接口定義部分(fēn)
#import
@interfaceShoe:NSObject{
NSString*_shoeColor;
int_shoeSize;
}
//鞋子(zǐ)尺寸
-(void)setSize:(i♥ ∏§nt)size;
-(int)Size;
//鞋子(zǐ)顔色
-(void)setColor:(NSStri§<₹¶ng*)color;
-(NSString*)Color;
//設置鞋子(zǐ)的(de)顔色和(hé)尺碼
-(void)setColorAndSize:(♠•¶NSString*)pColorshoeSize:(int)pSi≤λ←ze;
@end
Shoe.m實現(xiàn)部分(fēn)
//
//Shoe.m
//MemoryManage_1
//
//Createdbyjimmy.yanβ gon11-2-19.
//Copyright2011__MyCompanyName__€'₩.Allrightsreserved.
//
#import"Shoe.h"
@implementationShoe
//構造函數(shù)
-(id)init
{
if(self=[superinit]){
_shoeColor=@"blac↕$★'k";
_shoeSize=35;
}
NSLog(@"一(yī)雙%@%d碼的(de)鞋子(zǐ)造好(h•γγ₩ǎo)了(le)!",_shoeColor,_shoeSize);
return(self);
}
-(void)setColor:(NSSt•§ring*)newColor
{
_shoeColor=newColor;
}
-(NSString*)Color
{
return_shoeColor;
}
-(void)setSize:(int)newSize
{
_shoeSize=newSize;
}
-(int)Size
{
return_shoeSize;
}
-(void)setColorAndSize:(NSString*✔)colorshoeSize:(int)size
{
[selfsetColor:color];
[selfsetSize:size];
}
//析構函數(shù)
-(void)dealloc
{
NSLog(@"%@%d碼的(de)鞋子(zǐ)!",_shoe∑≤€✘Color,_shoeSize);
[superdealloc];
}
@end
Man.h定義部分(fēn)
//
//Man.h
//MemoryManage_1
//
//Createdbyjimmy.yangon1φ≈1-2-20.
//Copyright2011__MyCompany ♥Name__.Allrightsreserved.↓✘×↕
//
#import
#import"Shoe.h"
@interfaceMan:NSObject{
NSString*_name;
Shoe*_shoe;
}
-(void)setName:(NSString*)name¥Ω↑;
-(NSString*)Name;
-(void)wearShoe:(Shoe*)shoe;
@end
Man.m實現(xiàn)部分(fēn)
//
//Man.m
//MemoryManage_1
//
//Createdbyjimmy.yangon11-2-20.
//Copyright2011__MyCompanyN"∑∏ame__.Allrightsreserved.
//
#import"Man.h"
@implementationMan
//構造函數(shù)
-(id)init
{
if(self=[superinit]){
_name=@"noname";
}
NSLog(@"新人(rén)"%@"出生(sh¥£¥ēng)了(le)!",_name);
return(self);
}
-(void)setName:(NSString*)new'®∏Name
{
_name=newName;
}
-(NSString*)Name
{
return_name;
}
-(void)wearShoe:(Shoe*)shoe
{
_shoe=shoe;
}
//析構函數(shù)
-(void)dealloc
{
NSLog(@""%@"信息!",_nam¶$€e);
[superdealloc];
}
- 歡迎大(dà)家(jiā)閱讀(dú)浏覽,部分(fēn)內(n∏₹"èi)容來(lái)源于網絡,如(rú)有(yǒ ≤™πu)侵權,請(qǐng)聯系我們删除!
- 上(shàng)一(yī)條:5.20日(rì)音(yīn)訊,系統設備驅動程序分(fēn)類
- 下(xià)一(yī)條:5.22日(rì)音(yīn)訊,訪問(wèn)W×☆<in磁盤詳解
服務項目
熱(rè)門(mén)信息
- 邯鄲網絡公司:模闆建站(zhàn)的(d→§ δe)好(hǎo)處有(yǒu)哪些(xiē)?
- 3642024-04-25

- 4.9日(rì)訊,企業(yè)網站(zhàn)建設如(rú)何發揮網¶'ε絡營銷功能(néng)?
- 4092024-04-09

- 邯鄲網絡公司:網站(zhàn)建設開(kāi£× )發有(yǒu)哪些(xiē)細節需要(yào)注意?
- 5402024-03-07

- 簡單3步,輕松做(zuò)企業(yè)官網
- 6822024-02-18
