Objective C記憶體管理教程和原理剖析(二)

2021-06-21 23:53:41 字數 3368 閱讀 4045

口訣與正規化

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

2

3

[obj1 release];

obj1 = nil;

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

1

2

3

4

5

6

7

8

9

classa *obj2 = obj1;

[obj2 retain];

//do something

[obj2 release];

obj2 = nil;

2.5 在乙個函式中建立並返回物件,需要把這個物件設定為autorelease 1

2

3

4

5

6

7

8

9

classa *func1()

2.6 在子類的dealloc方法中呼叫基類的dealloc方法

1

2

3

4

5

6

7

8

9

-(void) 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。

1

self.objb 或者obja.objb

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

1

[objb release];

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

@inte***ce classa : nsobject

@property (retain) classb* objb;

@end

@implementation classa

@synthesize objb;

-(void) dealloc

@end

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

void funcnoautorelease()

void funcautorelease()

Objective C記憶體管理

objective c的物件記憶體管理是一件非常有意思的事情,由其是在iphone嵌入式裝置中 想玩的省心點,就得熟知它的管理規則,由其是記憶體的管理機制。了解它的品性了才能在cocoa的世界裡如魚得水。否則,反之 如水得魚!1,乙個物件可以有乙個或多個擁有者 2,當它乙個擁有者都沒有時,它就會被 ...

Objective C 記憶體管理

objective c 記憶體管理 nsautoreleasepool pool nsautoreleasepool alloc init pool drain 事實上程式中可以有多個自動釋放池。自動釋放池其實並不包含實際的物件本身,僅僅是對釋放的對 象的引用。通過向目前的自動釋放池傳送一條auto...

Objective C 記憶體管理

objective c中,記憶體物件分二類 1 值型別,如 int float struct等基本資料型別 2 引用型別,通常是指繼承自nsobject類的oc物件 值型別在棧中,由系統自動管理,而引用型別在堆上,需要我們自己手工進行管理 oc中提供了二種記憶體管理機制 1 手動引用計數 mrc m...