iPhone/Mac Objective-C記憶體管理教程和原理剖析(二)口訣與範式

來源:互聯網
上載者:User

著作權聲明

此文著作權歸作者Vince Yuan (vince.yuan#gmail.com)所有。歡迎非營利性轉載,轉載時必須包含原始連結http://vinceyuan.cnblogs.com,且必須包含此著作權聲明的完整內容。

 

 

版本 1.1 發表於2010-03-08

 

二口訣與範式

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          建立一個對象。

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

2.2          建立一個autorelease的對象。

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

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

[obj1 release];

obj1 = nil;

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

ClassA *obj2 = obj1;

[obj2 retain];

//do something

[obj2 release];

obj2 = nil;

2.5          在一個函數中建立並返回對象,需要把這個對象設定為autorelease

ClassA *Func1()

{

  ClassA *obj = [[[ClassA alloc]init]autorelease];

  return obj;

}

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

-(void) dealloc

{

         …

         [super dealloc];

}

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

2.7.1     聲明一個成員變數。

ClassB *objB;

2.7.2     聲明property,加上retain參數。

@property (retain) ClassB* objB;

2.7.3     定義property。(property的預設實現請看第三章)

@synthesize objB;

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

self.objB 或者objA.objB

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

[objB release];

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

@interface ClassA : NSObject

{

         ClassB* objB;

}

 

@property (retain) ClassB* objB;

@end

 

@implementation ClassA

@synthesize objB;

-(void) dealloc

{

         [objB release];

         [super dealloc];

}

@end

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

void funcNoAutorelease()

{

         ClassB *objB1 = [[ClassB alloc]init];

         ClassA *objA = [[ClassA alloc]init];

         objA.objB = objB1;

         [objB1 release];

         [objA release];

}

 

void funcAutorelease()

{

         ClassB *objB1 = [[[ClassB alloc]init] autorelease];

         ClassA *objA = [[[ClassA alloc]init] autorelease];

         objA.objB = objB1;

}

範例程式碼檔案連結:http://files.cnblogs.com/VinceYuan/objective-c-memman.zip

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.