1. 程式人生 > >iOS/OS X記憶體管理(一):基本概念與原理

iOS/OS X記憶體管理(一):基本概念與原理

在Objective-C的記憶體管理中,其實就是引用計數(reference count)的管理。記憶體管理就是在程式需要時程式設計師分配一段記憶體空間,而當使用完之後將它釋放。如果程式設計師對記憶體資源使用不當,有時不僅會造成記憶體資源浪費,甚至會導致程式crach。我們將會從引用計數和記憶體管理規則等基本概念開始,然後講述有哪些記憶體管理方法,最後注意有哪些常見記憶體問題。

166109-6f9ffb5f0dad7d27.png

memory management from apple document

基本概念

引用計數(Reference Count)

為了解釋引用計數,我們做一個類比:員工在辦公室使用燈的情景。

166109-679cb7139c451968.png

引用Pro Multithreading and Memory Management for iOS and OS X的圖

  • 當第一個人進入辦公室時,他需要使用燈,於是開燈,引用計數為1

  • 當另一個人進入辦公室時,他也需要燈,引用計數為2;每當多一個人進入辦公室時,引用計數加1

  • 當有一個人離開辦公室時,引用計數減1,當引用計數為0時,也就是最後一個人離開辦公室時,他不再需要使用燈,關燈離開辦公室。

記憶體管理規則

從上面員工在辦公室使用燈的例子,我們對比一下燈的動作與Objective-C物件的動作有什麼相似之處:

QQ截圖20160217165706.png

燈的動作 Objective-C物件的動作

因為我們是通過引用計數來管理燈,那麼我們也可以通過引用計數來管理使用Objective-C物件。

166109-5b6b9fef51d9b80a.png

引用Pro Multithreading and Memory Management for iOS and OS X的圖

而Objective-C物件的動作對應有哪些方法以及這些方法對引用計數有什麼影響?

QQ截圖20160217165754.png

當你alloc一個物件objc,此時RC=1;在某個地方你又retain這個物件objc,此時RC加1,也就是RC=2;由於呼叫alloc/retain一次,對應需要呼叫release一次來釋放物件objc,所以你需要release物件objc兩次,此時RC=0;而當RC=0時,系統會自動呼叫dealloc方法釋放物件。

Autorelease Pool

在開發中,我們常常都會使用到區域性變數,區域性變數一個特點就是當它超過作用域時,就會自動釋放。而autorelease pool跟區域性變數類似,當執行程式碼超過autorelease pool塊時,所有放在autorelease pool的物件都會自動呼叫release。它的工作原理如下:

  • 建立一個NSAutoreleasePool物件

  • 在autorelease pool塊的物件呼叫autorelease方法

  • 釋放NSAutoreleasePool物件

166109-4f0ef3af1b674dfe.png

引用Pro Multithreading and Memory Management for iOS and OS X的圖

iOS 5/OS X Lion前的(等下會介紹引入ARC的寫法)例項程式碼如下:

1 2 3 4 5 6 7 8 9 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];   // put object into pool id obj = [[NSObject alloc] init]; [obj autorelease];   [pool drain];   /* 超過autorelease pool作用域範圍時,obj會自動呼叫release方法 */

由於放在autorelease pool的物件並不會馬上釋放,如果有大量圖片資料放在這裡的話,將會導致記憶體不足。

1 2 3 4 5 6 7 8 for  (int i = 0; i < numberOfImages; i++) {        /*   處理圖片,例如載入         *   太多autoreleased objects存在         *   由於NSAutoreleasePool物件沒有被釋放         *   在某個時刻,會導致記憶體不足          */ }

ARC管理方法

iOS/OS X記憶體管理方法有兩種:手動引用計數(Manual Reference Counting)和自動引用計數(Automatic Reference Counting)。從OS X Lion和iOS 5開始,不再需要程式設計師手動呼叫retain和release方法來管理Objective-C物件的記憶體,而是引入一種新的記憶體管理機制Automatic Reference Counting(ARC),簡單來說,它讓編譯器來代替程式設計師來自動加入retain和release方法來持有和放棄物件的所有權。

在ARC記憶體管理機制中,id和其他物件型別變數必須是以下四個ownership qualifiers其中一個來修飾:

  • __strong(預設,如果不指定其他,編譯器就預設加入)

  • __weak

  • __unsafe_unretained

  • __autoreleasing

所以在管理Objective-C物件記憶體的時候,你必須選擇其中一個,下面會用一些列子來逐個解釋它們的含義以及如何選擇它們。

__strong ownership qualifier

如果我想建立一個字串,使用完之後將它釋放呼叫,使用MRC管理記憶體的寫法應該是這樣:

1 2 3 4 5 {

       //@"Hello, world"物件的RC=1

     NSString *text = [[NSString alloc] initWithFormat:@ "Hello, world" ];         NSLog(@ "%@" , text);      [text release];                       //@"Hello, world"物件的RC=0 }

而如果是使用ARC方式的話,就text物件無需呼叫release方法,而是當text變數超過作用域時,編譯器來自動加入[text release]方法來釋放記憶體

1 2 3 4 5 6 7 {

       //@"Hello, world"物件的RC=1

     NSString *text = [[NSString alloc] initWithFormat:@ "Hello, world" ];          NSLog(@ "%@" , text); } /*   *  當text超過作用域時,@"Hello, world"物件會自動釋放,RC=0   */

而當你將text賦值給其他變數anotherText時,MRC需要retain一下來持有所有權,當text和anotherText使用完之後,各個呼叫release方法來釋放。

1 2 3 4 5 6 7 8 9 10 11 {        //@"Hello, world"物件的RC=1      NSString *text = [[NSString alloc] initWithFormat:@ "Hello, world" ];      NSLog(@ "%@" , text);

相關推薦

iOS/OS X記憶體管理()基本概念原理

在Objective-C的記憶體管理中,其實就是引用計數(reference count)的管理。記憶體管理就是在程式需要時程式設計師分配一段記憶體空間,而當使用完之後將它釋放。如果程式設計師對記憶體資源使用不當,有時不僅會造成記憶體資源浪費,甚至會導致程式crach。我們將會從引用計數和記憶體管理

iOS/OS X 記憶體管理(二)藉助工具解決記憶體問題

這篇我們主要關注在實際開發中會遇到哪些記憶體管理問題,以及如何使用工具來除錯和解決。 在往下看之前請下載例項MemoryProblems,我們將以這個工程展開如何檢查和解決記憶體問題。 懸掛指標問題 懸掛指標(Dangling Pointer

iOS/OS X記憶體管理基本概念原理

CSDN移動將持續為您優選移動開發的精華內容,共同探討移動開發的技術熱點話題,涵蓋移動應用、開發工具、移動遊戲及引擎、智慧硬體、物聯網等方方面面。如果您想投稿、尋求《近匠》報道,或給文章挑錯,歡迎傳送郵件至tangxy#csdn.net(請把#改成@)。  在Objective-C的記憶體管理中,其實就

RabbitMQ學習筆記基本概念環境搭建

一、定義     MQ(Message Queue,訊息佇列)是基於應用程式之間的一種通訊方式,應用程式通過讀寫出入佇列的訊息進行通訊,而不需要用專用的連線來連線它們。訊息通訊指的是程式之間在訊息中傳遞資訊進行通訊,而不是傳統的通過直接呼叫(如RPC)的方式進行通訊。MQ的

OS X 記憶體管理

上一篇部落格iOS/OS X記憶體管理(一):基本概念與原理主要講了iOS/OSX 記憶體管理中引用計數和記憶體管理規則,以及引入ARC新的記憶體管理機制之後如何選擇ownership qualifiers(__strong、__weak、__unsafe_unretai

應用負載均衡之LVS()基本概念和三種模式

保存 訪問 方式 video big key vhdl cisc vid 網站架構中,負載均衡技術是實現網站架構伸縮性的主要手段之一。所謂"伸縮性",是指可以不斷向集群中添加新的服務器來提升性能、緩解不斷增加的並發用戶訪問壓力。通俗地講,就是一頭牛拉不動時,就用兩頭、三

高可用之KeepAlived()基本概念和配置文件分析

leg bold touch event radius chm present ket temp KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 本文目錄:1. 概述2. VRRP協

python學習筆記()基本概念

單引號 網絡爬蟲 解釋型 g模式 deb 恢復 判斷語句 安裝 bubuko ---恢復內容開始--- 一.python簡介 pyhthon是解釋型語言,python可以用來網絡爬蟲、數據分析、web開發、人工智能、嵌入式、自動化測試、自動化運維等,所有語言中,地方放庫最多

Python並行程式設計()基本概念

  1、執行緒和程序       程序是應用程式的一個執行例項,比如,在桌面上雙擊瀏覽器將會執行一個瀏覽器。執行緒是一個控制流程,可以在程序內與其他活躍的執行緒同時執行。控制流程指的是順序執行一些機器指令。程序可以包含多個執行緒,所以開啟一個瀏覽器,作業系統將建立一個程序,並開始執行這個程序的主執行緒。每一

Kafka學習筆記基本概念

1、Kafka是什麼 Kafka是最初由Linkedin公司開發,是一個分散式、分割槽的、多副本的、多訂閱者,基於zookeeper協調的分散式日誌系統(也可以當做MQ系統),常見可以用於web/nginx日誌、訪問日誌,訊息服務等等,Linkedin於2010年貢獻給了Apache基金會併成為

MongoDB入門基本概念

一.資料庫的分類 目前的資料庫主要分為關係型資料庫和非關係型資料。 關係型資料庫: 通過SQL結構化查詢和儲存語句,最常見的就是Oracle和MySQL 保持資料一致性理論,遵循ACID原理 非關係型資料庫: - Not Only SQL,是對不同於

Google leveldb學習筆記基本架構安裝使用

簡介 LevelDB是一個Google編寫的快速鍵值儲存庫,它提供從字串鍵到字串值的有序對映。 基本架構 LSM樹儲存引擎 先說什麼是儲存引擎: 儲存引擎是儲存系統的發動機,直接決定了儲存系統能夠提供的效能和功能 儲存系統的基本功能包括:增刪讀改,讀取操作又

Flex佈局(基本概念和容器屬性)

前言 算上來快2個月沒寫部落格呢,一是趕專案,二是中途接到一個朋友公司需要幫忙,週末都在TA們公司兼職,然後空下來就快12月初,然後又陸陸續續發生一些大事小事,當然最令人記憶猶新就是借錢。 這個月初由於財務出了點問題,找了幾個朋友借錢,當然也包括自己借過錢的

lotou詳解基本概念

lotou是一個基於golang的支援分散式的輕量級遊戲伺服器框架,主要提供遊戲伺服器叢集的訊息轉發程式碼倉庫 lotou提供了三種不同的訊息傳送方式: 1.Send 用於普通的訊息推送,不需要返回,傳送之後就不再關注 2.Request 非同步非阻塞請

Druid.io系列(二)基本概念架構

在介紹Druid架構之前,我們先結合有關OLAP的基本原理來理解Druid中的一些基本概念。 1 資料 以圖3.1為例,結合我們在第一章中介紹的OLAP基本概念,按列的型別上述資料可以分成以下三類: 時間序列(Timestamp),Druid既是記憶

(教你徹底理解)網路流基本概念演算法 最大流最小割

一.網路流:流&網路&割 1.網路流問題(NetWork Flow Problem): 給定指定的一個有向圖,其中有兩個特殊的點源S(Sources)和匯T(Sinks),每條邊有指定的容量(Capacity),求滿足條件的從S到T的最大流(Max

docker 鏡像容器管理

docker 鏡像 容器 Docker的優勢:1、啟動非常快,秒級實現。2、資源利用率高,在機器中以進程的方式存在,一臺機器可以跑上百個docker容器。3、創建和配置後可以在任意地方運行docker,只需將其上傳到docker倉庫,用到時拉下來就可以4、易遷移,平臺依賴性不強。Docker的主要

Python爬蟲(基本概念

popu 通用 字符 spider dai 自身 部分 螞蟻 people 網絡爬蟲的定義 網絡爬蟲(Web Spider。又被稱為網頁蜘蛛。網絡機器人,又稱為網頁追逐者),是一種依照一定的規則,自己主動的抓取萬維網信息的程序或者腳本。另外一些不常使用

OC溫習基本數據類型

類型 註意 nsh com unsigned 存儲空間 double類型 編譯 存儲 類型限定修飾詞 除了上圖中基本數據類型之外, 還有一些類型限定修飾詞: short短型:修飾 int double; long長型:修飾 int double; signed 有符號型

使用SLF4J和LOGBACK ( 基本使用)

asi 個人 fig 接口實現 pac 再次 intro 級別 多說 1.SLF4J是什麽? slf4j是一個日誌門面,它不是具體的日誌實現框架,而是提供了通用的日誌接口,按個人理解來說,是通過接口實現多態,來滿足應用在不同日誌框架間切換的需求。 例如在程序中我們需要記錄