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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274766.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

同態加密應用_重新設計具有同態性的銀行應用

同態加密應用Catering user preference is undoubtedly a never-ending task. End of the day, it takes all sorts to make a world. For that reason, it is deemed important to design with the accent of communicating core business value, and resolving user needs wi…

(字節/華為/美團)前端面經記錄冷冷清清的金三銀四

大家好,我是若川。持續組織了8個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列從畢業…

PHP連接PGSQL

function conn($hostName,$Login,$Password,$dbName,$Port) //建立目標數據庫連接 {$conn &ADONewConnection(postgres8);$conn->debug false; //true時adodb將在頁面顯示debug信息$conn->LogSQL(false); //true時adodb將建立adodb_sqllog表記錄每次sql操作$conn-&…

netflix_Netflix播放按鈕剖析

netflixWe will develop a play pause button similar to the one the Netflix video player has.我們將開發一個類似于Netflix視頻播放器的播放暫停按鈕。 Since Swift has replaced Objective-C as the default development language for iOS, the same will apply to Swift…

TypeScript 終極初學者指南

大家好,我是若川。持續組織了8個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列在過去…

繼承與多態(六)

繼承 1.繼承 a。.直接在類的后面加上冒號“:”后面跟基類,就該類就繼承了基類的一切特性了。 b。private類不能被繼承,只有public、protected類能被繼承。 c。private類不里面所有的屬性和方法都不能被外界訪問,只有他自己可以。 …

標記偏見_如何(巧妙地)扭曲視覺效果以支持您的偏見敘事

標記偏見Data is important — it is the logical justification for world-changing decisions. Unfortunately, arrays of numbers don’t tell as interpretable a story as a picture does, providing an insatiable need for data visualizations.數據很重要-這是改變世界…

高瓴投資,頂配創業團隊,dora 誠招前端 / Flutter

dora 是一個可以跨越設計稿,直接生成應用的新一代設計工具。讓任何 Creator 都能輕松構建個性化的網站和應用,無需編寫一行代碼。通過自主研發的全新技術,我們為用戶打造了完全自由度的設計與開發體驗,足以滿足任何復雜場景的個性…

獵鷹spacex_SpaceX:簡單,美觀的界面是未來

獵鷹spacex重點 (Top highlight)A photo has been floating around the internet showing how the interior of the new Dragon spacecraft differs from the Space Shuttle. The difference is staggering, but not entirely suprprising. After all the Shuttle started oper…

object的classid收集

比如&#xff1a; wbbrowser控件 <OBJECT idWB classidCLSID:8856F961-340A-11D0-A96B-00C04FD705A2 VIEWASTEXT></OBJECT> 畫圖控件 <OBJECT idSGrfxCtl1 classidclsid:369303C2-D7AC-11D0-89D5-00A0C90833E6 ></OBJECT> 上下滾動條控件 <OB…

如何高效學習前端新知識,拓展視野,我推薦

技術日新月異&#xff0c;發展迅速&#xff0c;作為一個與時俱進的互聯網人&#xff0c;需要不斷地學習擴寬視野。今天為大家推薦幾個技術領域中出類拔萃的公眾號&#xff0c;它們的每一篇推文都值得你點開&#xff01;1前端開發愛好者學習路線 數據結構算法 前端進階「前端開發…

開發交接文檔_為開發人員創造更好的設計交接體驗

開發交接文檔It’s 2020. We’re supposed to have flying cars and space travel. We should at least have our process for design handoff nailed down at this point.現在是2020年。我們應該有飛行汽車和太空旅行。 在這一點上&#xff0c;我們至少應該確定我們的設計移交…

同步器之Exchanger

類java.util.concurrent.Exchanger提供了一個同步點&#xff0c;在這個同步點&#xff0c;一對線程可以交換數據。每個線程通過exchange()方法的入口提供數據給他的伙伴線程&#xff0c;并接收他的伙伴線程提供的數據&#xff0c;并返回。 當在運行不對稱的活動時很有用&#x…

?Cookie 從入門到進階:一文徹底弄懂其原理以及應用

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列Cooki…

ui設計師常用的設計工具_2020年應該使用哪個UI設計工具?

ui設計師常用的設計工具重點 (Top highlight)It’s 2020, the market today is saturated with UI design tools. Ever since Sketch app came out with its sleek, simple, and efficient tool to craft user interface design, many companies have followed suit to take a …

Ajax拖放頁面元素(圖片)

最近了解了一點YUI的控件知識.先做個Ajax拖放頁面元素(圖片)以便學習參考. 現在有一些網站如QQ空間,都允許用戶自定義模塊,可以任意拖動模塊到各個地方去.YUI在這一方面做得比較好.下面以一組圖片的方式來說明如何運用Ajax拖放頁面元素: 第一步:在<head></head>標簽…

你不知道的vscode之空間控制

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列王志遠…

正則表達式說明

參考地址&#xff1a; 正則表達式說明 正則表達式全部符號解釋轉載于:https://www.cnblogs.com/s-bridge/archive/2012/06/26/2564396.html

lynda ux_UX心態

lynda uxI have had the pleasure of training and mentoring several UX people at the beginning of their careers.在職業生涯的初期&#xff0c;我很高興接受培訓和指導。 Whatever your background or experience, I’ve found repeatedly that there are some key miles…

什么 Leader 值得追隨?

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。目前建有江西|湖南|湖北 籍 前端群&#xff0c;想進群的可以加我微信 ruochuan12 進群。歷…