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

Objective-C學習筆記Cocoa生命周期

移動開發 iOS
Objective-C學習筆記Cocoa生命周期是本文要介紹的內容,主要是來學習Cocoa中對象的生命周期,每個對象有一個與之相關聯的整數,稱做它的引用計數器或保留計數器,來看內容。

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

1、引用計數(reference counting):

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

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

當一個對象因其保留計數器歸0而將被銷毀時,Objective-C自動向對象發送一條dealloc消息。你可以在自己的對象中重寫dealloc方法。可以通過這種方式釋放已經分配的全部相關資源。一定不要直接調用dealloc方法。要獲得保留計數器的當前值,可以發送retainCount消息。簽名如下:

  1. - (id) retain;      
  2. //申請- (void) release;      
  3. //釋放- (unsigned) retainCount;          
  4. //當前計數器值  
  5.  
  6. 例如:[[car retain] setTire: tire atIndex:2];  表示要求car對象將其保留計數器值加1并執行setTire操作。Example:  
  7.  
  8. //   
  9.   //  Main.m   
  10.   //  RetainCount1   
  11.   //  內存管理練習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、對象所有權(object ownership):

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

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

回憶一下在OOP基礎章節里Car的engine setter方法:

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

以及如何在main()函數中調用該方法:

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

現在哪個實體擁有engine對象?是main()函數還是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; 

該方法預先設定了一條在將來某個時間發送的release消息,其返回值是接收消息的對象。當給一個對象發送autorelease消息時,實際上是將該對象添加到NSAutoreleasePool中。當自動釋放池被銷毀時,會向該池中的所有對象發送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庫工具中,創建和銷毀自動釋放池的方法非常明確:

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

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

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

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

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

  1. OBJECTIVE-C CODE   :RetainCount2   
  2.  
  3.  //  
  4. //  Main.m  
  5. //  RetainCount2  
  6. //  內存管理練習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.  // 創建一個自動釋放池  
  40.  NSAutoreleasePool *pool;  
  41.  pool = [[NSAutoreleasePool alloc] init];  
  42.    
  43.  // 創建(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.  // 向對象發送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;  

小結:Objective-C學習筆記Cocoa生命周期的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

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- 靜態庫

2011-07-22 15:42:39

Objective-C UIView 內存

2011-05-11 14:06:49

Objective-C

2013-08-21 14:57:42

objective-c問題

2009-06-11 11:28:35

JSF生命周期

2011-08-04 11:04:14

Objective-C 面向對象 繼承

2011-08-04 10:38:17

Objective-C 預處理程序

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 協議 函數

2010-07-17 16:31:15

cycle lifebada

2015-07-08 10:47:57

Using Swift CocoaObjective-C
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品福利在线 | 亚洲精品国产电影 | 日韩国产欧美 | 91中文字幕 | 欧美专区日韩 | 国产91亚洲精品一区二区三区 | 天堂久久天堂综合色 | 久久男人 | 免费观看毛片 | 91久久久久久久久久久 | 在线免费观看a级片 | 亚洲www| 黑人巨大精品欧美一区二区免费 | 欧洲亚洲视频 | 欧美综合色 | 国产亚洲精品久久情网 | 久久tv在线观看 | 亚洲成人播放器 | 成人精品一区二区 | 国产精品久久久久久久久久免费看 | 久久久久国产一区二区三区四区 | 欧美性tv| 日韩电影免费观看中文字幕 | 日韩免费高清视频 | 99热碰| 国产黄视频在线播放 | 亚洲精品在线视频 | 精品欧美一区二区三区久久久 | 亚洲激精日韩激精欧美精品 | 欧美片网站免费 | 国产精品日韩欧美一区二区三区 | 一区二区中文 | 三级av在线| 欧美专区在线 | 日韩一区二区在线视频 | 蜜桃在线播放 | 午夜精品一区二区三区在线观看 | 激情伊人网| 国产精品亚洲一区二区三区在线 | 爱爱视频在线观看 | 91色在线 |