• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            厚積薄發(fā),滴水穿石

            搬家到主站了:http://www.cnblogs.com/cokecoffe/
            隨筆 - 45, 文章 - 8, 評(píng)論 - 12, 引用 - 0
            數(shù)據(jù)加載中……

            iPhone/Mac Objective-C內(nèi)存管理教程和原理剖析(二)口訣與范式

            版權(quán)聲明

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

             

            版本 1.1 發(fā)表于2010-03-08

             

             口訣與范式

            1           口訣。

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

            1.2          除了allocnewcopy之外的方法創(chuàng)建的對(duì)象都被聲明了autorelease

            1.3          誰(shuí)retain,誰(shuí)release。只要你調(diào)用了retain,無(wú)論這個(gè)對(duì)象是如何生成的,你都要調(diào)用release。有時(shí)候你的代碼中明明沒有retain,可是系統(tǒng)會(huì)在默認(rèn)實(shí)現(xiàn)中加入retain。不知道為什么蘋果公司的文檔沒有強(qiáng)調(diào)這個(gè)非常重要的一點(diǎn),請(qǐng)參考范式2.7和第三章。

            2           范式。
            范式就是模板,就是依葫蘆畫瓢。由于不同人有不同的理解和習(xí)慣,我總結(jié)的范式不一定適合所有人,但我能保證照著這樣做不會(huì)出問(wèn)題。

            2.1          創(chuàng)建一個(gè)對(duì)象。

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

            2.2          創(chuàng)建一個(gè)autorelease的對(duì)象。

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

            2.3          Release一個(gè)對(duì)象后,立即把指針清空。(順便說(shuō)一句,release一個(gè)空指針是合法的,但不會(huì)發(fā)生任何事情)

            [obj1 release];

            obj1 = nil;

            2.4          指針賦值給另一個(gè)指針。

            ClassA *obj2 = obj1;

            [obj2 retain];

            //do something

            [obj2 release];

            obj2 = nil;

            2.5          在一個(gè)函數(shù)中創(chuàng)建并返回對(duì)象,需要把這個(gè)對(duì)象設(shè)置為autorelease

            ClassA *Func1()

            {

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

              return obj;

            }

            2.6          在子類的dealloc方法中調(diào)用基類的dealloc方法

            -(void) dealloc

            {

                     …

                     [super dealloc];

            }

            2.7          在一個(gè)class中創(chuàng)建和使用property

            2.7.1     聲明一個(gè)成員變量。

            ClassB *objB;

            2.7.2     聲明property,加上retain參數(shù)。

            @property (retain) ClassB* objB;

            2.7.3     定義property。(property的默認(rèn)實(shí)現(xiàn)請(qǐng)看第三章)

            @synthesize objB;

            2.7.4     除了dealloc方法以外,始終用.操作符的方式來(lái)調(diào)用property

            self.objB 或者objA.objB

            2.7.5     dealloc方法中release這個(gè)成員變量。

            [objB release];

            示例代碼如下(詳細(xì)代碼請(qǐng)參考附件中的memman-property.m,你需要特別留意對(duì)象是在何時(shí)被銷毀的。):

            @interface ClassA : NSObject

            {

                     ClassB* objB;

            }

             

            @property (retain) ClassB* objB;

            @end

             

            @implementation ClassA

            @synthesize objB;

            -(void) dealloc

            {

                     [objB release];

                     [super dealloc];

            }

            @end

            2.7.6     給這個(gè)property賦值時(shí),有手動(dòng)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

            posted on 2011-12-07 21:48 Wangkeke 閱讀(237) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Iphone development

            久久精品视屏| 色综合久久综合中文综合网| 久久精品成人免费国产片小草| 国内精品久久久久久久久电影网| 亚洲国产成人久久综合区| 久久99国产综合精品女同| 久久99热国产这有精品| 久久综合视频网| 国产成人久久精品区一区二区| 久久久综合香蕉尹人综合网| 久久亚洲精精品中文字幕| 久久中文精品无码中文字幕| 91精品国产综合久久精品| 伊人色综合久久天天人手人婷| 亚洲国产精品久久久久久| 久久久噜噜噜www成人网| 亚洲国产精品一区二区三区久久| 久久精品国产一区| 久久婷婷五月综合97色一本一本 | 性做久久久久久久久浪潮| 国产精品一久久香蕉国产线看观看| 亚洲国产精品无码久久久久久曰 | 久久99国产精品久久| 久久久久女人精品毛片| 国产激情久久久久久熟女老人| 久久精品国产精品亚洲| 丰满少妇人妻久久久久久4| 国产99久久精品一区二区| 国产韩国精品一区二区三区久久| 亚洲精品tv久久久久久久久| 伊人久久大香线蕉亚洲五月天| 一级做a爰片久久毛片毛片| 色偷偷91久久综合噜噜噜噜| 久久夜色精品国产www| 无码人妻久久一区二区三区蜜桃| 久久亚洲精品无码播放| 开心久久婷婷综合中文字幕| 日本久久久久久久久久| 久久人人爽人人人人爽AV| 久久国语露脸国产精品电影| 久久人人爽人人爽人人片av高请|