自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

 

口訣與范式

1.口訣。

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

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

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

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

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

 

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

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

 

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

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

 

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

 

2.4指針賦值給另一個(gè)指針。

 

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

 

2.5在一個(gè)函數(shù)中創(chuàng)建并返回對象,需要把這個(gè)對象設(shè)置為autorelease

 

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

 

2.6在子類的dealloc方法中調(diào)用基類的dealloc方法

 

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

 

2.7在一個(gè)class中創(chuàng)建和使用property。

2.7.1聲明一個(gè)成員變量。

 

  1. ClassB *objB; 

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

  1. @property (retain) ClassB* objB; 

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

 

  1. @synthesize objB; 

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

self.objB 或者objA.objB

2.7.5在dealloc方法中release這個(gè)成員變量。

 

  1. [objB release]; 

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

 

  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給這個(gè)property賦值時(shí),有手動(dòng)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

 

責(zé)任編輯:閆佳明 來源: oschina
相關(guān)推薦

2011-07-21 09:42:27

Objective-C 內(nèi)存 Autoreleas

2011-07-19 15:15:09

Objective-C 內(nèi)存

2013-04-11 14:32:00

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

2013-04-11 14:37:36

Objective-CiOS內(nèi)存管理系統(tǒng)自動(dòng)創(chuàng)建新的aut

2013-04-11 13:57:27

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

2011-07-18 17:14:16

Objective-C 內(nèi)存 Cocoa

2011-07-29 16:08:31

Objective-C 內(nèi)存

2011-07-27 17:10:30

Objective-C 持久化

2011-05-11 15:45:50

內(nèi)存管理Objective-C

2011-07-20 17:04:43

Objective-C 內(nèi)存 內(nèi)存泄露

2011-07-21 10:10:42

Objective-C 內(nèi)存 Autoreleas

2011-07-21 09:32:07

Objective-C 內(nèi)存 Autoreleas

2011-08-18 13:28:35

Objective-C內(nèi)存

2011-08-01 11:37:41

iPhone Objective- 內(nèi)存

2011-08-16 17:43:47

Objective-C內(nèi)存管理Autorelease

2011-07-08 13:49:46

Objective-C UUID

2011-08-05 14:03:39

Objective-C 對象 模板

2011-08-16 10:23:04

Objective-CNSAutoreleaXcode常用鍵

2011-08-22 09:48:16

WindowsObjective-C

2013-05-02 10:51:17

iOS開發(fā)Objective-C@property
點(diǎn)贊
收藏

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