<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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          除了alloc、newcopy之外的方法創建的對象都被聲明了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://m.tkk7.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 閱讀(814) 評論(0)  編輯  收藏 所屬分類: 轉載
    主站蜘蛛池模板: 日韩亚洲一区二区三区| 日韩国产欧美亚洲v片 | 亚洲精品无码你懂的| 免费国产小视频在线观看| 在线观看特色大片免费网站| 亚洲人成在线播放| 亚洲福利精品一区二区三区| 日韩精品无码专区免费播放| 亚洲第一成年网站视频| 国产亚洲精AA在线观看SEE| 最新猫咪www免费人成| 国产在线观看免费av站| 亚洲中文字幕无码久久2020| 久久亚洲色一区二区三区| 国产无人区码卡二卡三卡免费| 国产免费A∨在线播放| 亚洲一本之道高清乱码| 亚洲色偷拍区另类无码专区| 美女视频黄是免费的网址| aa级女人大片喷水视频免费| 亚洲性无码AV中文字幕| 亚洲av无码国产精品色午夜字幕| 精品免费久久久久久成人影院| 免费国产黄网站在线观看可以下载| 色五月五月丁香亚洲综合网| 99久久亚洲综合精品成人网| 亚洲第一黄色网址| 午夜视频在线观看免费完整版| 久久精品视频免费看| 黄页网站在线免费观看| 亚洲一级特黄特黄的大片| 久久精品国产亚洲综合色| 国产男女猛烈无遮档免费视频网站 | 91香蕉国产线观看免费全集| 日本高清免费中文在线看| 亚洲一级大黄大色毛片| 久久亚洲精品中文字幕无码| 亚洲区不卡顿区在线观看| 国产男女猛烈无遮档免费视频网站 | 亚洲AV永久纯肉无码精品动漫 | 亚洲国产黄在线观看|