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

Objective-C內存管理教程和原理剖析(二)口訣與范式

移動開發 iOS
范式就是模板,就是依葫蘆畫瓢。由于不同人有不同的理解和習慣,我總結的范式不一定適合所有人,但我能保證照著這樣做不會出問題。誰創建,誰釋放除了alloc,new或copy之外的方法創建的對象都被聲明了autorelease,誰retain,誰release。

 

口訣與范式

1.口訣。

1.1誰創建,誰釋放(類似于“誰污染,誰治理”)。如果你通過alloc、new或copy來創建一個對象,那么你必須調用release或autorelease。換句話說,不是你創建的,就不用你去釋放。
例如,你在一個函數中alloc生成了一個對象,且這個對象只在這個函數中被使用,那么你必須在這個函數中調用release或autorelease。如果你在一個class的某個方法中alloc一個成員對象,且沒有調用autorelease,那么你需要在這個類的dealloc方法中調用release;如果調用了autorelease,那么在dealloc方法中什么都不需要做。

1.2除了alloc、new或copy之外的方法創建的對象都被聲明了autorelease。

1.3誰retain,誰release。只要你調用了retain,無論這個對象是如何生成的,你都要調用release。有時候你的代碼中明明沒有retain,可是系統會在默認實現中加入retain。不知道為什么蘋果公司的文檔沒有強調這個非常重要的一點,請參考范式2.7和第三章。

2.范式。
范式就是模板,就是依葫蘆畫瓢。由于不同人有不同的理解和習慣,我總結的范式不一定適合所有人,但我能保證照著這樣做不會出問題。

2.1創建一個對象。

 

  1. ClassA *obj1 = [[ClassA alloc] init]; 

2.2創建一個autorelease的對象。

 

  1. ClassA *obj1 = [[[ClassA alloc] init] autorelease]; 

2.3Release一個對象后,立即把指針清空。(順便說一句,release一個空指針是合法的,但不會發生任何事情)

 

  1. [obj1 release]; 
  2. obj1 = nil; 

 

2.4指針賦值給另一個指針。

 

  1. ClassA *obj2 = obj1; 
  2. [obj2 retain]; 
  3. //do something 
  4. [obj2 release]; 
  5. obj2 = nil; 

 

2.5在一個函數中創建并返回對象,需要把這個對象設置為autorelease

 

  1. ClassA *Func1() 
  2.   ClassA *obj = [[[ClassA alloc]init]autorelease]; 
  3.   return obj; 

 

2.6在子類的dealloc方法中調用基類的dealloc方法

 

  1. -(void) dealloc 
  2.          … 
  3.          [super dealloc]; 

 

2.7在一個class中創建和使用property。

2.7.1聲明一個成員變量。

 

  1. ClassB *objB; 

2.7.2聲明property,加上retain參數。

  1. @property (retain) ClassB* objB; 

2.7.3定義property。(property的默認實現請看第三章)

 

  1. @synthesize objB; 

2.7.4除了dealloc方法以外,始終用.操作符的方式來調用property。

self.objB 或者objA.objB

2.7.5在dealloc方法中release這個成員變量。

 

  1. [objB release]; 

示例代碼如下(詳細代碼請參考附件中的memman-property.m,你需要特別留意對象是在何時被銷毀的。):

 

  1. @interface ClassA : NSObject 
  2.          ClassB* objB; 
  3. @property (retain) ClassB* objB; 
  4. @end 
  5.  
  6. @implementation ClassA 
  7. @synthesize objB; 
  8. -(void) dealloc 
  9.          [objB release]; 
  10.          [super dealloc]; 
  11. @end 

 

2.7.6給這個property賦值時,有手動release和autorelease兩種方式。

 

  1. void funcNoAutorelease() 
  2.          ClassB *objB1 = [[ClassB alloc]init]; 
  3.          ClassA *objA = [[ClassA alloc]init]; 
  4.          objA.objB = objB1; 
  5.          [objB1 release]; 
  6.          [objA release]; 
  7. void funcAutorelease() 
  8.          ClassB *objB1 = [[[ClassB alloc]init] autorelease]; 
  9.          ClassA *objA = [[[ClassA alloc]init] autorelease]; 
  10.          objA.objB = objB1; 

 

 

 

示例代碼文件鏈接:http://files.cnblogs.com/VinceYuan/objective-c-memman.zip

 

責任編輯:閆佳明 來源: oschina
相關推薦

2011-07-19 15:15:09

Objective-C 內存

2011-07-21 09:42:27

Objective-C 內存 Autoreleas

2013-04-11 14:37:36

Objective-CiOS內存管理系統自動創建新的aut

2013-04-11 14:32:00

Objective-CiOS開發內存管理@synthesize

2013-04-11 13:57:27

Objective-CiOS開發內存管理

2011-07-18 17:14:16

Objective-C 內存 Cocoa

2011-07-29 16:08:31

Objective-C 內存

2011-07-27 17:10:30

Objective-C 持久化

2011-05-11 15:45:50

內存管理Objective-C

2011-07-20 17:04:43

Objective-C 內存 內存泄露

2011-07-21 09:32:07

Objective-C 內存 Autoreleas

2011-07-21 10:10:42

Objective-C 內存 Autoreleas

2011-08-01 11:37:41

iPhone Objective- 內存

2011-08-16 17:43:47

Objective-C內存管理Autorelease

2011-08-18 13:28:35

Objective-C內存

2011-07-08 13:49:46

Objective-C UUID

2011-08-05 14:03:39

Objective-C 對象 模板

2011-08-22 09:48:16

WindowsObjective-C

2011-08-16 10:23:04

Objective-CNSAutoreleaXcode常用鍵

2013-05-02 10:51:17

iOS開發Objective-C@property
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久国产一区二区三区四区 | 九九精品在线 | 久久伊人青青草 | 婷婷色国产偷v国产偷v小说 | 四虎伊人 | 久久久久亚洲精品中文字幕 | 欧美一级二级三级视频 | 午夜三级在线观看 | 有码一区 | 精品视频一区二区三区四区 | 色综合99| 日韩不卡三区 | 国内精品一区二区 | 色资源站 | 日韩成人高清在线 | 久久久久久久久久毛片 | 一区二区在线看 | 午夜激情影院 | 亚洲一区二区在线播放 | 国产在线精品一区二区三区 | 黄色国产在线播放 | 国产一区二区三区久久久久久久久 | 日韩欧美国产一区二区 | 久久久久久久久久影视 | 亚洲一区二区在线播放 | 国产精品视频一二三 | 国产九九精品视频 | 欧美九九 | www.99久久.com| 91资源在线观看 | 毛片一级片 | 中文字幕一区二区三区精彩视频 | 日韩精品一区中文字幕 | 精品久久久久久久久久久院品网 | 日韩欧美一区二区三区免费观看 | 欧美日韩在线一区二区 | 亚洲精品乱码久久久久v最新版 | 中文字幕一区二区三区精彩视频 | 二区中文字幕 | 少妇精品久久久久久久久久 | 日日夜夜精品视频 |