成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Objective-C學(xué)習(xí)筆記Cocoa生命周期

移動開發(fā) iOS
Objective-C學(xué)習(xí)筆記Cocoa生命周期是本文要介紹的內(nèi)容,主要是來學(xué)習(xí)Cocoa中對象的生命周期,每個對象有一個與之相關(guān)聯(lián)的整數(shù),稱做它的引用計數(shù)器或保留計數(shù)器,來看內(nèi)容。

Objective-C學(xué)習(xí)筆記Cocoa生命周期是本文要介紹的內(nèi)容,主要是來學(xué)習(xí)Cocoa中對象生命周期對象生命周期包括誕生(通過alloc或new方法實現(xiàn))、生存(接收消息和執(zhí)行操作)、交友(借助方法的組合和參數(shù))、釋放(當(dāng)它們的生命結(jié)束時最終死去)。當(dāng)對象生命周期結(jié)束時,它們的原材料(內(nèi)存)將被回收以供新的對象使用。

1、引用計數(shù)(reference counting):

每個對象有一個與之相關(guān)聯(lián)的整數(shù),稱做它的引用計數(shù)器或保留計數(shù)器。當(dāng)某段代碼需要訪問一個對象時,該代碼將該對象的保留計數(shù)器值加1,表示“我要訪問該對象”。當(dāng)這段代碼結(jié)束對象訪問時,將對象的保留計數(shù)器值減1,表示它不再訪問該對象。當(dāng)保留計數(shù)器值為0時,表示不再有代碼訪問該對象了,因此對象將被銷毀,其占用的內(nèi)存被系統(tǒng)回收以便重用。

當(dāng)使用alloc、new或copy(生成接收對象的一個副本)創(chuàng)建一個對象時,對象的保留計數(shù)器值被設(shè)置成1.要增加對象的保留計數(shù)器值,可以給對象發(fā)送一條retain消息,要減少對象的保留計數(shù)器值,可以給對象發(fā)送一條release消息。

當(dāng)一個對象因其保留計數(shù)器歸0而將被銷毀時,Objective-C自動向?qū)ο蟀l(fā)送一條dealloc消息。你可以在自己的對象中重寫dealloc方法。可以通過這種方式釋放已經(jīng)分配的全部相關(guān)資源。一定不要直接調(diào)用dealloc方法。要獲得保留計數(shù)器的當(dāng)前值,可以發(fā)送retainCount消息。簽名如下:

  1. - (id) retain;      
  2. //申請- (void) release;      
  3. //釋放- (unsigned) retainCount;          
  4. //當(dāng)前計數(shù)器值  
  5.  
  6. 例如:[[car retain] setTire: tire atIndex:2];  表示要求car對象將其保留計數(shù)器值加1并執(zhí)行setTire操作。Example:  
  7.  
  8. //   
  9.   //  Main.m   
  10.   //  RetainCount1   
  11.   //  內(nèi)存管理練習(xí)1   
  12.   //  
  13.   //  Created by Elf Sundae on 10/23/10.   
  14.   //  Copyright 2010 Elf.Sundae(at)Gmail.com. All rights reserved.   
  15.  //   
  16.    #import <Cocoa/Cocoa.h> 
  17.  @interface RetainTracker : NSObject  
  18.  @end15   
  19.  @implementation RetainTracker  
  20.    - (id) init  
  21.  {  
  22.      if (self = [super init])  
  23.     {  
  24.          NSLog(@"init: Retain count of %d.",[self retainCount]);  
  25.      }  
  26.      return self;25 }  
  27.   - (void) dealloc28 {  
  28.     NSLog(@"dealloc called.Bye Bye.");  
  29.       [super dealloc];31 }  
  30. @end  
  31.   int main (int argc, const char * argv[])   
  32.  {  
  33.     RetainTracker *tracker = [RetainTracker new];  
  34.      [tracker retain];  
  35.      NSLog(@"%d",[tracker retainCount]);  
  36.      [tracker retain];  
  37.      NSLog(@"%d",[tracker retainCount]);  
  38.     [tracker release];  
  39.      NSLog(@"%d",[tracker retainCount]);  
  40.     [tracker release];  
  41.      NSLog(@"%d",[tracker retainCount]);  
  42.     [tracker retain];  
  43.      NSLog(@"%d",[tracker retainCount]);  
  44.    [tracker release];  
  45.     NSLog(@"%d",[tracker retainCount]);  
  46.      [tracker release];  
  47.    return 0;66 } 

輸出:

  1. init: Retain count of 1.  
  2. dealloc called.Bye Bye. 

2、對象所有權(quán)(object ownership):

如果一個對象具有指向其他對象的實例變量,則稱該對象擁有這些對象。這意味著該實體要負(fù)責(zé)確保對其擁有的對象進行清理。

當(dāng)多個實體擁有某個特定對象時,對象的所有權(quán)關(guān)系就更復(fù)雜了,這也是保留計數(shù)器值可能大于1的原因。在上面的RetainCount1例子中,main()函數(shù)擁有RetainTracker類的對象,因此main()要負(fù)責(zé)清理該類的對象。

回憶一下在OOP基礎(chǔ)章節(jié)里Car的engine setter方法:

  1. - (void) setEngine: (Engine *) newEngine; 

以及如何在main()函數(shù)中調(diào)用該方法:

  1. Engine *engine = [Engine new];[car setEngine: engine]; 

現(xiàn)在哪個實體擁有engine對象?是main()函數(shù)還是Car類?

下面是編寫setEngine的一種更好的方法:

  1. - (void) setEngine: (Engine *) newEngine  
  2. {  
  3.     [newEngine retain];  
  4.    [engine release];  
  5.    engine = newEngine;  
  6. } // setEngine 

在訪問方法中,如果先保留新對象,然后再釋放舊對象,這不會出問題。

  1. In your accessors, if you retain the new object before you release the old object, you’ll be safe. 

3、自動釋放(Autorelease)

自動釋放池(autorelease pool),它是一個存放實體的池(集合),這些實體可能是對象,能夠被自動釋放。

NSObject類提供了一個autorelease方法:

  1. - (id) autorelease; 

該方法預(yù)先設(shè)定了一條在將來某個時間發(fā)送的release消息,其返回值是接收消息的對象。當(dāng)給一個對象發(fā)送autorelease消息時,實際上是將該對象添加到NSAutoreleasePool中。當(dāng)自動釋放池被銷毀時,會向該池中的所有對象發(fā)送release消息。

  1. - (NSString *) description   
  2. {  
  3.     NSString *description;   
  4.     description = [[NSString alloc]   
  5.        initWithFormat: @"I am %d years old", 4];   
  6.    return ([description autorelease]);7} // description 

自動釋放池的銷毀時間:

在使用Foundation庫工具中,創(chuàng)建和銷毀自動釋放池的方法非常明確:

  1. NSAutoreleasePool *pool;pool = [[NSAutoreleasePool alloc] init];…[pool release];  

創(chuàng)建一個自動釋放池時,該池自動成為活動的池。釋放該池時,其保留計數(shù)器值歸0,然后該池被銷毀。在銷毀過程中,該池釋放其包含的所有對象。

當(dāng)時用AppKit時,Cocoa定期自動為你創(chuàng)建和銷毀自動釋放池。通常是在程序處理完當(dāng)前事件(如鼠標(biāo)單擊或按鍵)以后執(zhí)行這些操作。你可以使用任意多的自動釋放對象,當(dāng)不再使用它們時,自動釋放池將自動為你清理這些對象

說明:在Xcode自動生成的代碼中使用了另一種銷毀自動釋放池中對象的方式:-drain方法,該方法只是清空自動釋放池而不銷毀它。-drain方法只適用于Mac OS X 10.4(Tiger)及更高版本。

自動釋放池的工作過程:示例:RetainCount2

  1. OBJECTIVE-C CODE   :RetainCount2   
  2.  
  3.  //  
  4. //  Main.m  
  5. //  RetainCount2  
  6. //  內(nèi)存管理練習(xí)2: 使用自動釋放池  
  7. //  
  8. //  Created by Elf Sundae on 10/25/10.  
  9. //  Copyright 2010 Elf.Sundae(at)Gmail.com. All rights reserved.  
  10. //  
  11.  
  12. #import <Cocoa/Cocoa.h> 
  13.  
  14. @interface RetainTracker : NSObject  
  15.  
  16. @end  
  17.  
  18. @implementation RetainTracker  
  19.  
  20. - (id) init  
  21. {  
  22.  if (self = [super init])  
  23.  {  
  24.   NSLog(@"init: Retain count of %d.",[self retainCount]);  
  25.  }  
  26.  return self;  
  27. }  
  28.  
  29. - (void) dealloc  
  30. {  
  31.  NSLog(@"dealloc called.Bye Bye.");  
  32.  [super dealloc];  
  33. }  
  34.  
  35. @end  
  36.  
  37. int main (int argc, const char * argv[])   
  38. {  
  39.  // 創(chuàng)建一個自動釋放池  
  40.  NSAutoreleasePool *pool;  
  41.  pool = [[NSAutoreleasePool alloc] init];  
  42.    
  43.  // 創(chuàng)建(new)一個RetainTracket對象  
  44.  RetainTracker *tracker = [RetainTracker new]; // count:1  
  45.  NSLog(@"%d",[tracker retainCount]);  
  46.    
  47.  // 處于演示目的,retain一個trancker  
  48.  [tracker retain]; // count:2  
  49.  NSLog(@"%d",[tracker retainCount]);  
  50.    
  51.  // 向?qū)ο蟀l(fā)送autorelease消息,將該對象添加到自動釋放池pool中  
  52.  [tracker autorelease]; // count: still 2  
  53.  NSLog(@"%d",[tracker retainCount]);  
  54.    
  55.  // release該對象以抵消上面的 retain  
  56.  [tracker release]; //count: 1  
  57.  NSLog(@"%d",[tracker retainCount]);  
  58.    
  59.  NSLog(@"releaseing pool");  
  60.  [pool release];  
  61.    
  62.  return 0;  

小結(jié):Objective-C學(xué)習(xí)筆記Cocoa生命周期的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-05-11 15:19:01

CocoaObjective-C

2011-08-04 14:58:37

Objective-C Cocoa NSString

2011-08-05 14:03:39

Objective-C 對象 模板

2011-07-07 14:22:27

Cocoa 對象 生命周期

2011-07-28 18:11:18

Objective-C Cocoa 編程

2011-08-16 10:23:04

Objective-CNSAutoreleaXcode常用鍵

2011-08-04 13:55:10

Cocoa Objective- 文件

2011-07-27 16:36:03

iphone Objective- 靜態(tài)庫

2011-07-22 15:42:39

Objective-C UIView 內(nèi)存

2011-05-11 14:06:49

Objective-C

2013-08-21 14:57:42

objective-c問題

2011-08-04 11:04:14

Objective-C 面向?qū)ο? 繼承

2011-08-04 10:38:17

Objective-C 預(yù)處理程序

2009-06-11 11:28:35

JSF生命周期

2011-06-27 15:48:09

Cocoa TouchObjective-C

2011-07-25 10:03:06

Objective-C 委托

2011-08-04 13:43:30

Objective-C 私有變量

2011-07-25 14:27:10

Objective-C 協(xié)議 函數(shù)

2010-07-17 16:31:15

cycle lifebada

2015-07-08 10:47:57

Using Swift CocoaObjective-C
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久精品综合 | 久久综合一区二区三区 | 四虎永久免费黄色影片 | 国产在线一区二区三区 | 亚洲激情av| 日韩中文字幕在线视频观看 | 精品久久久一区二区 | 最近日韩中文字幕 | 久久国产欧美一区二区三区精品 | 欧美大片一区二区 | 久久久久久久久久久久一区二区 | 色吊丝2288sds中文字幕 | 国产黄色小视频在线观看 | 最新中文字幕在线 | 黄色骚片 | 欧美精品久久久 | 黄色毛片免费 | 成人免费在线播放视频 | 久久中文字幕一区 | 中文字幕在线一区二区三区 | 日韩在线视频免费观看 | 成人在线观看免费视频 | 欧美日韩在线播放 | 日韩a级片| 91精品国产自产精品男人的天堂 | 欧美三级三级三级爽爽爽 | 四虎影院新地址 | 日韩欧美国产精品一区 | 东京av男人的天堂 | 美女黄视频网站 | 国产成人一区在线 | 国产日产精品一区二区三区四区 | 久久亚洲一区 | 久久免费观看视频 | 中文字幕av在线 | 天堂av中文在线 | 中文字幕国产在线 | 在线观看中文字幕av | 国产黄色在线观看 | 欧美黑人又粗大 | 欧美1区|