新聞資訊
記錄首創點滴進步 見(jiàn)證遠(yuǎn)行(xíng)δ✘
我們一(yī)直緊跟時(shí)代前沿,聚焦行(xíng)業(yèδ™)實時(shí)動态,發布公司最新資訊,歡迎您​™δ₩的(de)關注

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)聯系我們删除!

+ 查看(kàn)更多(duō)我們的(de)客戶 / Our client

    24小(xiǎo)時(shí)技(jì)術(sh ÷ù)支持
    18931045623
    在線客服

首創簡介

    首創網絡成立于2012年(nián),是(s€&§hì)一(yī)家(jiā)專業(yè)的♥×>(de)品牌網站(zhàn)設計(jì)和÷γ±(hé)網絡營銷推廣公司,服務領域涵蓋網站(zhàn)設計(jì)、市(sh₩δì)場(chǎng)策劃、企業(yè)畫(©∑©huà)冊及VI視(shì)覺設計(jì)、網站(zhàn)域名空(kō ♦₽ng)間(jiān)等領域,公司擁有(yǒu)一(y→≠ī)批高(gāo)素質人(rén)才,著(♦₹§€zhe)力打造品牌網站(zhàn)設計(jì)制(zhì)作→÷(zuò)和(hé)網上(shàng)營銷策略執行(xíng)兩大(dà)σ©γβ優勢。

    十年(nián)來(lái),憑借對(duì)市(shì)場(chǎng)趨β§β<勢敏銳的(de)洞察,和(hé)對(duì)消費(fèi)者、企業(yè¶↓)形态深刻的(de)理(lǐ)解,我們服務的(de)已遍及京津冀、長(ch∑®♦áng)三角、珠三角等領域,行(xíng)業(yè)覆蓋政£δ府機(jī)構、企事(shì)業(yè)單位、無線通(t♠" ōng)訊、環保、電(diàn)子(zǐ)、醫(yī)藥、交通(tōng↑↕®<)、園林(lín)、地(dì)産等行(xíng)業(y​¶₩è),諸多(duō)知(zhī)名企業(yè¥₹♠•),如(rú)廣州京信集團、廣東(dōng)聯↔↑Ω>通(tōng)廣州分(fēn)公司、搜狐家(jiā)≥↓β♥居廣州站(zhàn)、搜狐家(jiā)居邯鄲站(z&✘≠‌hàn)等,都(dōu)鑒證了(le)首創設計(jì)公司的(de)品牌設計§®§(jì)思想與能(néng)力,首創設計(jì)公®₩α司也(yě)與諸多(duō)企業(yè)勃的(de)市(shì)場(chǎσ♦σng)經濟中互促共生(shēng)。

在線客服


  • 掃描加微(wēi)信

  • 掃描加QQ

  • 掃描浏覽手機(jī)版
首創網絡邯鄲公司
邯鄲公司
服務熱(rè)線:0310-4559740 / 18931045623₹↔≠  公司地(dì)址:邯鄲市(shì)叢台區(qū)頤高(gāo)廣場(chǎ₩ ₽ng)B座13層1304室  客戶接待:邯∑<>鄲市(shì)陵園路(lù)669号康橋國(guó)際B06