ObjC內存管理的原則和範式

原則函數

1. 誰建立,誰釋放(相似於「誰污染,誰治理」)。若是你經過alloc、new或copy來建立一個對象,那麼你必須調用release或autorelease。換句話說,不是你建立的,就不用你去釋放。
例如,你在一個函數中alloc生成了一個對象,且這個對象只在這個函數中被使用,那麼你必須在這個函數中調用release或autorelease。若是你在一個class的某個方法中alloc一個成員對象,且沒有調用autorelease,那麼你須要在這個類的dealloc方法中調用release;若是調用了autorelease,那麼在dealloc方法中什麼都不須要作。spa

2. 除了alloc、new或copy以外的方法建立的對象都被聲明瞭autorelease。指針

3. 誰retain,誰release。只要你調用了retain,不管這個對象是如何生成的,你都要調用release。有時候你的代碼中明明沒有retain,但是系統會在默認實現中加入retain。
不知道爲何蘋果公司的文檔沒有強調這個很是重要的一點,請參考範式7和第三章。code


範式
範式就是模板,就是依葫蘆畫瓢。因爲不一樣人有不一樣的理解和習慣,我總結的範式不必定適合全部人,但我能保證照着這樣作不會出問題。對象

1 建立一個對象。blog

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

 

2 建立一個autorelease的對象。文檔

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

 

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

[obj1 release];
obj1 = nil;

 

4 指針賦值給另外一個指針。io

ClassA *obj2 = obj1;
[obj2 retain];
//do something
[obj2 release];
obj2 = nil;

 

5 在一個函數中建立並返回對象,須要把這個對象設置爲autorelease模板

ClassA *Func1(){
  ClassA *obj = [[[ClassA alloc]init] autorelease];
  return obj;
}

 

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

-(void) dealloc{
      …
     [super dealloc];
}

 

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

聲明一個成員變量:
ClassB *objB;

聲明property,加上retain參數:
@property (retain) ClassB* objB;

定義property:
@synthesize objB;

除了dealloc方法之外,始終用.操做符的方式來調用property:

self.objB 或者objA.objB

在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

給這個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;
}

 
相關文章
相關標籤/搜索