日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iPhone/Mac Objective-C内存管理教程和原理剖析(二)口诀与范式转

發布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iPhone/Mac Objective-C内存管理教程和原理剖析(二)口诀与范式转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

版權聲明

此文版權歸作者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

轉載于:https://www.cnblogs.com/sawyerzhu/archive/2012/06/04/2534383.html

總結

以上是生活随笔為你收集整理的iPhone/Mac Objective-C内存管理教程和原理剖析(二)口诀与范式转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。