隨筆-193  評論-715  文章-1  trackbacks-0

          版權聲明

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

           

          版本 1.1 發表于2010-03-08

           

           口訣與范式

          1           口訣。

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

          1.2          除了allocnewcopy之外的方法創建的對象都被聲明了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賦值時,有手動releaseautorelease兩種方式。

          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

          @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
          posted on 2011-12-01 09:25 Robin's Programming World 閱讀(825) 評論(0)  編輯  收藏 所屬分類: 轉載
          主站蜘蛛池模板: 新龙县| 商河县| 广东省| 屯留县| 丹江口市| 常德市| 高淳县| 湘乡市| 特克斯县| 辽源市| 海口市| 读书| 阜平县| 漳浦县| 章丘市| 广元市| 子长县| 陇西县| 辽阳市| 东丽区| 改则县| 达尔| 武宣县| 江口县| 霞浦县| 扶余县| 互助| 亚东县| 宁远县| 富锦市| 锦屏县| 汾阳市| 自贡市| 南通市| 同德县| 肇源县| 邹城市| 土默特右旗| 台南县| 章丘市| 南乐县|