偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

 

口訣與范式

1.口訣。

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

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

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

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

2.1創(chuàng)建一個對象。

 

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

2.2創(chuàng)建一個autorelease的對象。

 

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

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

 

  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在一個函數(shù)中創(chuàng)建并返回對象,需要把這個對象設置為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中創(chuàng)建和使用property。

2.7.1聲明一個成員變量。

 

  1. ClassB *objB; 

2.7.2聲明property,加上retain參數(shù)。

  1. @property (retain) ClassB* objB; 

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

 

  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內存管理系統(tǒng)自動創(chuàng)建新的aut

2013-04-11 14:32:00

Objective-CiOS開發(fā)內存管理@synthesize

2013-04-11 13:57:27

Objective-CiOS開發(fā)內存管理

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開發(fā)Objective-C@property
點贊
收藏

51CTO技術棧公眾號