iPhone/Mac Objective-C內存管理教程和原理剖析(二)口訣與范式Posted on 2010-03-08 00:35 Vince Yuan 閱讀(2331) 評論(1) 編輯 收藏版權聲明 此文版權歸作者Vince Yuan (vince.yuan#gmail.com)所有。歡迎非營利性轉載,轉載時必須包含原始鏈接http://vinceyuan.cnblogs.com,且必須包含此版權聲明的完整內容。
版本 1.1 發表于2010-03-08
二 口訣與范式 1 口訣。 1.1 誰創建,誰釋放(類似于“誰污染,誰治理”)。如果你通過alloc、new或copy來創建一個對象,那么你必須調用release或autorelease。換句話說,不是你創建的,就不用你去釋放。 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一個空指針是合法的,但不會發生任何事情) [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 |